├── core ├── __init__.py ├── migrations │ ├── __init__.py │ ├── 0005_auto_20200626_1903.py │ ├── 0003_auto_20200625_2024.py │ ├── 0004_item_description.py │ ├── 0007_auto_20201206_1235.py │ ├── 0006_comment.py │ ├── 0002_auto_20200625_2010.py │ └── 0008_alter_address_id_alter_cart_id_alter_category_id_and_more.py ├── tests.py ├── apps.py ├── templatetags │ ├── pagination.py │ └── cart_template_tags.py ├── urls.py ├── forms.py └── admin.py ├── djangoecommerce ├── __init__.py ├── wsgi.py └── urls.py ├── static ├── scss │ ├── _custom-styles.scss │ ├── _custom-variables.scss │ ├── free │ │ ├── _depreciated.scss │ │ ├── _dropdowns.scss │ │ ├── _loader.scss │ │ ├── modules │ │ │ └── animations-extended │ │ │ │ └── animations-extended.scss │ │ ├── _footers.scss │ │ ├── _badges.scss │ │ ├── _input-group.scss │ │ ├── _list-group.scss │ │ ├── _cards.scss │ │ ├── _switch.scss │ │ ├── _carousels.scss │ │ ├── _tables.scss │ │ ├── _pagination.scss │ │ ├── _navbars.scss │ │ └── _animations-basic.scss │ ├── addons │ │ ├── _directives.scss │ │ ├── _rating.scss │ │ └── _hierarchical-display.scss │ ├── style.scss │ ├── _custom-skin.scss │ ├── core │ │ ├── _helpers.scss │ │ ├── _masks.scss │ │ ├── bootstrap │ │ │ └── _functions.scss │ │ ├── _typography.scss │ │ └── _global.scss │ ├── mdb.lite.scss │ └── mdb.scss ├── img │ ├── flags.png │ ├── sample.jpg │ ├── svg │ │ ├── flags.png │ │ ├── arrow_left.svg │ │ └── arrow_right.svg │ ├── overlays │ │ ├── 01.png │ │ ├── 02.png │ │ ├── 03.png │ │ ├── 04.png │ │ ├── 05.png │ │ ├── 06.png │ │ ├── 07.png │ │ ├── 08.png │ │ └── 09.png │ └── lightbox │ │ ├── preloader.gif │ │ ├── default-skin.png │ │ └── default-skin.svg ├── font │ └── roboto │ │ ├── Roboto-Bold.eot │ │ ├── Roboto-Bold.ttf │ │ ├── Roboto-Bold.woff │ │ ├── Roboto-Light.eot │ │ ├── Roboto-Light.ttf │ │ ├── Roboto-Thin.eot │ │ ├── Roboto-Thin.ttf │ │ ├── Roboto-Thin.woff │ │ ├── Roboto-Bold.woff2 │ │ ├── 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-Thin.woff2 │ │ └── Roboto-Regular.woff2 ├── css │ ├── style.min.css │ ├── addons │ │ ├── directives.min.css │ │ ├── rating.min.css │ │ ├── rating.css │ │ ├── directives.css │ │ ├── zmd.hierarchical-display.min.css │ │ ├── zmd.hierarchical-display.css │ │ └── datatables.min.css │ └── style.css └── js │ ├── modules │ ├── scrolling-navbar.js │ ├── default-file-input.js │ ├── enhanced-modals.js │ └── treeview.js │ └── addons │ ├── progressBar.min.js │ ├── progressBar.js │ ├── rating.min.js │ └── jquery.zmd.hierarchical-display.min.js ├── templates ├── account │ ├── base.html │ ├── messages │ │ ├── logged_out.txt │ │ ├── email_confirmation_sent.txt │ │ ├── logged_in.txt │ │ ├── password_changed.txt │ │ ├── password_set.txt │ │ ├── email_confirmed.txt │ │ ├── email_deleted.txt │ │ ├── primary_email_set.txt │ │ ├── unverified_primary_email.txt │ │ └── cannot_delete_primary_email.txt │ ├── email │ │ ├── email_confirmation_signup_message.txt │ │ ├── email_confirmation_signup_subject.txt │ │ ├── password_reset_key_subject.txt │ │ ├── email_confirmation_subject.txt │ │ ├── email_confirmation_message.txt │ │ └── password_reset_key_message.txt │ ├── snippets │ │ └── already_logged_in.html │ ├── account_inactive.html │ ├── password_reset_from_key_done.html │ ├── signup_closed.html │ ├── password_set.html │ ├── verification_sent.html │ ├── password_reset_done.html │ ├── logout.html │ ├── password_change.html │ ├── verified_email_required.html │ ├── password_reset.html │ ├── password_reset_from_key.html │ ├── email_confirm.html │ ├── signup.html │ ├── login.html │ └── email.html ├── openid │ ├── base.html │ └── login.html ├── socialaccount │ ├── base.html │ ├── snippets │ │ ├── login_extra.html │ │ └── provider_list.html │ ├── messages │ │ ├── account_connected_updated.txt │ │ ├── account_connected.txt │ │ ├── account_disconnected.txt │ │ └── account_connected_other.txt │ ├── authentication_error.html │ ├── login_cancelled.html │ ├── signup.html │ └── connections.html ├── tests │ ├── test_403_csrf.html │ └── design_form.html ├── ssl_payment.html ├── any_form.html ├── script.html ├── request_refund.html ├── base.html ├── complete.html ├── head.html ├── category.html ├── order_snippet.html ├── navbar.html ├── footer.html ├── customer_profile.html └── home-page.html ├── static_in_env ├── scss │ ├── _custom-styles.scss │ ├── _custom-variables.scss │ ├── free │ │ ├── _depreciated.scss │ │ ├── _dropdowns.scss │ │ ├── _loader.scss │ │ ├── modules │ │ │ └── animations-extended │ │ │ │ └── animations-extended.scss │ │ ├── _footers.scss │ │ ├── _badges.scss │ │ ├── _input-group.scss │ │ ├── _list-group.scss │ │ ├── _cards.scss │ │ ├── _switch.scss │ │ ├── _carousels.scss │ │ ├── _tables.scss │ │ ├── _pagination.scss │ │ ├── _navbars.scss │ │ └── _animations-basic.scss │ ├── addons │ │ ├── _directives.scss │ │ ├── _rating.scss │ │ └── _hierarchical-display.scss │ ├── style.scss │ ├── _custom-skin.scss │ ├── core │ │ ├── _helpers.scss │ │ ├── _masks.scss │ │ ├── bootstrap │ │ │ └── _functions.scss │ │ ├── _typography.scss │ │ └── _global.scss │ ├── mdb.lite.scss │ └── mdb.scss ├── img │ ├── flags.png │ ├── sample.jpg │ ├── overlays │ │ ├── 01.png │ │ ├── 02.png │ │ ├── 03.png │ │ ├── 04.png │ │ ├── 05.png │ │ ├── 06.png │ │ ├── 07.png │ │ ├── 08.png │ │ └── 09.png │ ├── svg │ │ ├── flags.png │ │ ├── arrow_left.svg │ │ └── arrow_right.svg │ └── lightbox │ │ ├── preloader.gif │ │ ├── default-skin.png │ │ └── default-skin.svg ├── font │ └── roboto │ │ ├── Roboto-Bold.eot │ │ ├── Roboto-Bold.ttf │ │ ├── Roboto-Bold.woff │ │ ├── Roboto-Bold.woff2 │ │ ├── Roboto-Light.eot │ │ ├── Roboto-Light.ttf │ │ ├── Roboto-Light.woff │ │ ├── Roboto-Medium.eot │ │ ├── Roboto-Medium.ttf │ │ ├── Roboto-Thin.eot │ │ ├── Roboto-Thin.ttf │ │ ├── Roboto-Thin.woff │ │ ├── Roboto-Thin.woff2 │ │ ├── Roboto-Light.woff2 │ │ ├── Roboto-Medium.woff │ │ ├── Roboto-Medium.woff2 │ │ ├── Roboto-Regular.eot │ │ ├── Roboto-Regular.ttf │ │ ├── Roboto-Regular.woff │ │ └── Roboto-Regular.woff2 ├── css │ ├── style.min.css │ ├── addons │ │ ├── directives.min.css │ │ ├── rating.min.css │ │ ├── rating.css │ │ ├── directives.css │ │ ├── zmd.hierarchical-display.min.css │ │ ├── zmd.hierarchical-display.css │ │ └── datatables.min.css │ └── style.css └── js │ ├── modules │ ├── scrolling-navbar.js │ ├── default-file-input.js │ ├── enhanced-modals.js │ └── treeview.js │ └── addons │ ├── progressBar.min.js │ ├── progressBar.js │ ├── rating.min.js │ └── jquery.zmd.hierarchical-display.min.js ├── .env ├── requirements.txt ├── manage.py └── .gitignore /core/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /core/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /djangoecommerce/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/scss/_custom-styles.scss: -------------------------------------------------------------------------------- 1 | // Your custom styles -------------------------------------------------------------------------------- /static/scss/_custom-variables.scss: -------------------------------------------------------------------------------- 1 | // Your custom variables -------------------------------------------------------------------------------- /templates/account/base.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | -------------------------------------------------------------------------------- /templates/account/messages/logged_out.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} -------------------------------------------------------------------------------- /static_in_env/scss/_custom-styles.scss: -------------------------------------------------------------------------------- 1 | // Your custom styles -------------------------------------------------------------------------------- /static_in_env/scss/_custom-variables.scss: -------------------------------------------------------------------------------- 1 | // Your custom variables -------------------------------------------------------------------------------- /templates/openid/base.html: -------------------------------------------------------------------------------- 1 | {% extends "socialaccount/base.html" %} 2 | -------------------------------------------------------------------------------- /templates/socialaccount/base.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | -------------------------------------------------------------------------------- /core/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /static/scss/free/_depreciated.scss: -------------------------------------------------------------------------------- 1 | // These settings will be only for one version 2 | 3 | -------------------------------------------------------------------------------- /static_in_env/scss/free/_depreciated.scss: -------------------------------------------------------------------------------- 1 | // These settings will be only for one version 2 | 3 | -------------------------------------------------------------------------------- /static/img/flags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/img/flags.png -------------------------------------------------------------------------------- /templates/socialaccount/snippets/login_extra.html: -------------------------------------------------------------------------------- 1 | {% load socialaccount %} 2 | 3 | {% providers_media_js %} 4 | -------------------------------------------------------------------------------- /core/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CoreConfig(AppConfig): 5 | name = 'core' 6 | -------------------------------------------------------------------------------- /static/img/sample.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/img/sample.jpg -------------------------------------------------------------------------------- /templates/account/messages/email_confirmation_sent.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% blocktrans %}{% endblocktrans %} 3 | -------------------------------------------------------------------------------- /static/img/svg/flags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/img/svg/flags.png -------------------------------------------------------------------------------- /templates/account/messages/logged_in.txt: -------------------------------------------------------------------------------- 1 | {% load account %} 2 | {% load i18n %} 3 | {% user_display user as name %} 4 | -------------------------------------------------------------------------------- /static/img/overlays/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/img/overlays/01.png -------------------------------------------------------------------------------- /static/img/overlays/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/img/overlays/02.png -------------------------------------------------------------------------------- /static/img/overlays/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/img/overlays/03.png -------------------------------------------------------------------------------- /static/img/overlays/04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/img/overlays/04.png -------------------------------------------------------------------------------- /static/img/overlays/05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/img/overlays/05.png -------------------------------------------------------------------------------- /static/img/overlays/06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/img/overlays/06.png -------------------------------------------------------------------------------- /static/img/overlays/07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/img/overlays/07.png -------------------------------------------------------------------------------- /static/img/overlays/08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/img/overlays/08.png -------------------------------------------------------------------------------- /static/img/overlays/09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/img/overlays/09.png -------------------------------------------------------------------------------- /static_in_env/img/flags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/img/flags.png -------------------------------------------------------------------------------- /static_in_env/img/sample.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/img/sample.jpg -------------------------------------------------------------------------------- /templates/account/email/email_confirmation_signup_message.txt: -------------------------------------------------------------------------------- 1 | {% include "account/email/email_confirmation_message.txt" %} 2 | -------------------------------------------------------------------------------- /templates/account/email/email_confirmation_signup_subject.txt: -------------------------------------------------------------------------------- 1 | {% include "account/email/email_confirmation_subject.txt" %} 2 | -------------------------------------------------------------------------------- /templates/account/messages/password_changed.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% blocktrans %}Password Changed.{% endblocktrans %} 3 | -------------------------------------------------------------------------------- /templates/socialaccount/messages/account_connected_updated.txt: -------------------------------------------------------------------------------- 1 | {% extends "socialaccount/messages/account_connected.txt" %} 2 | -------------------------------------------------------------------------------- /templates/account/messages/password_set.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% blocktrans %}Password successfully set.{% endblocktrans %} 3 | -------------------------------------------------------------------------------- /static/img/lightbox/preloader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/img/lightbox/preloader.gif -------------------------------------------------------------------------------- /static_in_env/img/overlays/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/img/overlays/01.png -------------------------------------------------------------------------------- /static_in_env/img/overlays/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/img/overlays/02.png -------------------------------------------------------------------------------- /static_in_env/img/overlays/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/img/overlays/03.png -------------------------------------------------------------------------------- /static_in_env/img/overlays/04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/img/overlays/04.png -------------------------------------------------------------------------------- /static_in_env/img/overlays/05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/img/overlays/05.png -------------------------------------------------------------------------------- /static_in_env/img/overlays/06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/img/overlays/06.png -------------------------------------------------------------------------------- /static_in_env/img/overlays/07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/img/overlays/07.png -------------------------------------------------------------------------------- /static_in_env/img/overlays/08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/img/overlays/08.png -------------------------------------------------------------------------------- /static_in_env/img/overlays/09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/img/overlays/09.png -------------------------------------------------------------------------------- /static_in_env/img/svg/flags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/img/svg/flags.png -------------------------------------------------------------------------------- /templates/account/messages/email_confirmed.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% blocktrans %}You have confirmed {{email}}.{% endblocktrans %} 3 | -------------------------------------------------------------------------------- /templates/account/messages/email_deleted.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% blocktrans %}Removed e-mail address {{email}}.{% endblocktrans %} 3 | -------------------------------------------------------------------------------- /templates/account/messages/primary_email_set.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% blocktrans %}Primary e-mail address set.{% endblocktrans %} 3 | -------------------------------------------------------------------------------- /static/font/roboto/Roboto-Bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/font/roboto/Roboto-Bold.eot -------------------------------------------------------------------------------- /static/font/roboto/Roboto-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/font/roboto/Roboto-Bold.ttf -------------------------------------------------------------------------------- /static/font/roboto/Roboto-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/font/roboto/Roboto-Bold.woff -------------------------------------------------------------------------------- /static/font/roboto/Roboto-Light.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/font/roboto/Roboto-Light.eot -------------------------------------------------------------------------------- /static/font/roboto/Roboto-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/font/roboto/Roboto-Light.ttf -------------------------------------------------------------------------------- /static/font/roboto/Roboto-Thin.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/font/roboto/Roboto-Thin.eot -------------------------------------------------------------------------------- /static/font/roboto/Roboto-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/font/roboto/Roboto-Thin.ttf -------------------------------------------------------------------------------- /static/font/roboto/Roboto-Thin.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/font/roboto/Roboto-Thin.woff -------------------------------------------------------------------------------- /static/font/roboto/Roboto-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/font/roboto/Roboto-Bold.woff2 -------------------------------------------------------------------------------- /static/font/roboto/Roboto-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/font/roboto/Roboto-Light.woff -------------------------------------------------------------------------------- /static/font/roboto/Roboto-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/font/roboto/Roboto-Light.woff2 -------------------------------------------------------------------------------- /static/font/roboto/Roboto-Medium.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/font/roboto/Roboto-Medium.eot -------------------------------------------------------------------------------- /static/font/roboto/Roboto-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/font/roboto/Roboto-Medium.ttf -------------------------------------------------------------------------------- /static/font/roboto/Roboto-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/font/roboto/Roboto-Medium.woff -------------------------------------------------------------------------------- /static/font/roboto/Roboto-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/font/roboto/Roboto-Medium.woff2 -------------------------------------------------------------------------------- /static/font/roboto/Roboto-Regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/font/roboto/Roboto-Regular.eot -------------------------------------------------------------------------------- /static/font/roboto/Roboto-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/font/roboto/Roboto-Regular.ttf -------------------------------------------------------------------------------- /static/font/roboto/Roboto-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/font/roboto/Roboto-Regular.woff -------------------------------------------------------------------------------- /static/font/roboto/Roboto-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/font/roboto/Roboto-Thin.woff2 -------------------------------------------------------------------------------- /static/img/lightbox/default-skin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/img/lightbox/default-skin.png -------------------------------------------------------------------------------- /static/font/roboto/Roboto-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static/font/roboto/Roboto-Regular.woff2 -------------------------------------------------------------------------------- /static_in_env/img/lightbox/preloader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/img/lightbox/preloader.gif -------------------------------------------------------------------------------- /templates/socialaccount/messages/account_connected.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% blocktrans %}The social account has been connected.{% endblocktrans %} 3 | -------------------------------------------------------------------------------- /templates/tests/test_403_csrf.html: -------------------------------------------------------------------------------- 1 | {% load socialaccount %} 2 | Sign In 3 | -------------------------------------------------------------------------------- /static_in_env/font/roboto/Roboto-Bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/font/roboto/Roboto-Bold.eot -------------------------------------------------------------------------------- /static_in_env/font/roboto/Roboto-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/font/roboto/Roboto-Bold.ttf -------------------------------------------------------------------------------- /static_in_env/font/roboto/Roboto-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/font/roboto/Roboto-Bold.woff -------------------------------------------------------------------------------- /static_in_env/font/roboto/Roboto-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/font/roboto/Roboto-Bold.woff2 -------------------------------------------------------------------------------- /static_in_env/font/roboto/Roboto-Light.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/font/roboto/Roboto-Light.eot -------------------------------------------------------------------------------- /static_in_env/font/roboto/Roboto-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/font/roboto/Roboto-Light.ttf -------------------------------------------------------------------------------- /static_in_env/font/roboto/Roboto-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/font/roboto/Roboto-Light.woff -------------------------------------------------------------------------------- /static_in_env/font/roboto/Roboto-Medium.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/font/roboto/Roboto-Medium.eot -------------------------------------------------------------------------------- /static_in_env/font/roboto/Roboto-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/font/roboto/Roboto-Medium.ttf -------------------------------------------------------------------------------- /static_in_env/font/roboto/Roboto-Thin.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/font/roboto/Roboto-Thin.eot -------------------------------------------------------------------------------- /static_in_env/font/roboto/Roboto-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/font/roboto/Roboto-Thin.ttf -------------------------------------------------------------------------------- /static_in_env/font/roboto/Roboto-Thin.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/font/roboto/Roboto-Thin.woff -------------------------------------------------------------------------------- /static_in_env/font/roboto/Roboto-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/font/roboto/Roboto-Thin.woff2 -------------------------------------------------------------------------------- /static_in_env/img/lightbox/default-skin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/img/lightbox/default-skin.png -------------------------------------------------------------------------------- /templates/socialaccount/messages/account_disconnected.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% blocktrans %}The social account has been disconnected.{% endblocktrans %} 3 | -------------------------------------------------------------------------------- /static_in_env/font/roboto/Roboto-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/font/roboto/Roboto-Light.woff2 -------------------------------------------------------------------------------- /static_in_env/font/roboto/Roboto-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/font/roboto/Roboto-Medium.woff -------------------------------------------------------------------------------- /static_in_env/font/roboto/Roboto-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/font/roboto/Roboto-Medium.woff2 -------------------------------------------------------------------------------- /static_in_env/font/roboto/Roboto-Regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/font/roboto/Roboto-Regular.eot -------------------------------------------------------------------------------- /static_in_env/font/roboto/Roboto-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/font/roboto/Roboto-Regular.ttf -------------------------------------------------------------------------------- /static_in_env/font/roboto/Roboto-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/font/roboto/Roboto-Regular.woff -------------------------------------------------------------------------------- /templates/account/messages/unverified_primary_email.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% blocktrans %}Your primary e-mail address must be verified.{% endblocktrans %} 3 | -------------------------------------------------------------------------------- /static_in_env/font/roboto/Roboto-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nabilmoiun/E-commerce-Website-Django/HEAD/static_in_env/font/roboto/Roboto-Regular.woff2 -------------------------------------------------------------------------------- /templates/account/messages/cannot_delete_primary_email.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% blocktrans %}You cannot remove your primary e-mail address ({{email}}).{% endblocktrans %} 3 | -------------------------------------------------------------------------------- /templates/socialaccount/messages/account_connected_other.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% blocktrans %}The social account is already connected to a different account.{% endblocktrans %} 3 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | SECRET_KEY=x_k4rgpyh95z#6pz6d9waw@69#c@(!1e+g*mi50u!i#wt7n20d 2 | STRIPE_SECRET_KEY=your-stripe-secret-key 3 | STRIPE_PUBLISHABLE_KEY=your-stripe-publishable-key 4 | DEBUG=FALSE 5 | -------------------------------------------------------------------------------- /templates/account/email/password_reset_key_subject.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% autoescape off %} 3 | {% blocktrans %}Password Reset E-mail{% endblocktrans %} 4 | {% endautoescape %} 5 | -------------------------------------------------------------------------------- /static/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 | } -------------------------------------------------------------------------------- /static_in_env/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 | } -------------------------------------------------------------------------------- /templates/account/email/email_confirmation_subject.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% autoescape off %} 3 | {% blocktrans %}Please Confirm Your E-mail Address{% endblocktrans %} 4 | {% endautoescape %} 5 | -------------------------------------------------------------------------------- /core/templatetags/pagination.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | 3 | register = template.Library() 4 | 5 | 6 | @register.filter(name='paginate') 7 | def paginate(pages): 8 | return range(1, pages + 1) 9 | -------------------------------------------------------------------------------- /templates/ssl_payment.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% block content %} 3 |
4 |
5 |

SSL Payment

6 |
7 |
8 | {% endblock content %} -------------------------------------------------------------------------------- /djangoecommerce/wsgi.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from django.core.wsgi import get_wsgi_application 4 | 5 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoecommerce.settings') 6 | 7 | application = get_wsgi_application() 8 | -------------------------------------------------------------------------------- /static/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 | -------------------------------------------------------------------------------- /static_in_env/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 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | Django==5.0.1 2 | django-allauth==0.60.1 3 | django-countries==7.5.1 4 | django-crispy-forms==2.1 5 | crispy-bootstrap4==2023.1 6 | pillow==10.2.0 7 | requests==2.31.0 8 | stripe==7.13.0 9 | python-decouple==3.8 10 | -------------------------------------------------------------------------------- /static/scss/free/_loader.scss: -------------------------------------------------------------------------------- 1 | // Loader / Spinner 2 | .fast { 3 | &.spinner-border { 4 | animation: spinner-border .4s linear infinite; 5 | } 6 | &.spinner-grow { 7 | animation: spinner-grow .4s linear infinite 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /static/img/svg/arrow_left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/img/svg/arrow_right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static_in_env/img/svg/arrow_left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static_in_env/img/svg/arrow_right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static_in_env/scss/free/_loader.scss: -------------------------------------------------------------------------------- 1 | // Loader / Spinner 2 | .fast { 3 | &.spinner-border { 4 | animation: spinner-border .4s linear infinite; 5 | } 6 | &.spinner-grow { 7 | animation: spinner-grow .4s linear infinite 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /static/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} -------------------------------------------------------------------------------- /static/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 | -------------------------------------------------------------------------------- /templates/account/snippets/already_logged_in.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% load account %} 3 | 4 | {% user_display user as user_display %} 5 |

{% trans "Note" %}: {% blocktrans %}you are already logged in as {{ user_display }}.{% endblocktrans %}

6 | -------------------------------------------------------------------------------- /static_in_env/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} -------------------------------------------------------------------------------- /static_in_env/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 | -------------------------------------------------------------------------------- /static/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} -------------------------------------------------------------------------------- /static_in_env/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} -------------------------------------------------------------------------------- /templates/tests/design_form.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 | Put the form here 7 |
8 |
9 |
10 |
11 |
-------------------------------------------------------------------------------- /static/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} -------------------------------------------------------------------------------- /static_in_env/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} -------------------------------------------------------------------------------- /templates/account/account_inactive.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block head_title %}{% trans "Account Inactive" %}{% endblock %} 6 | 7 | {% block content %} 8 |

{% trans "Account Inactive" %}

9 | 10 |

{% trans "This account is inactive." %}

11 | {% endblock %} 12 | -------------------------------------------------------------------------------- /templates/account/password_reset_from_key_done.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | {% block head_title %}{% trans "Change Password" %}{% endblock %} 5 | 6 | {% block content %} 7 |

{% trans "Change Password" %}

8 |

{% trans 'Your password is now changed.' %}

9 | {% endblock %} 10 | -------------------------------------------------------------------------------- /templates/account/signup_closed.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block head_title %}{% trans "Sign Up Closed" %}{% endblock %} 6 | 7 | {% block content %} 8 |

{% trans "Sign Up Closed" %}

9 | 10 |

{% trans "We are sorry, but the sign up is currently closed." %}

11 | {% endblock %} 12 | -------------------------------------------------------------------------------- /core/templatetags/cart_template_tags.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | from core.models import Cart 3 | 4 | register = template.Library() 5 | 6 | 7 | @register.filter 8 | def cart_item_count(user): 9 | if user.is_authenticated: 10 | qs = Cart.objects.filter(user=user, ordered=False) 11 | if qs.exists(): 12 | return qs[0].items.count() 13 | else: 14 | return 0 15 | -------------------------------------------------------------------------------- /static/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 | background-color: $footer-copyright-bg-color; 12 | color: $footer-copyright-color; 13 | } 14 | a { 15 | color: $white-base; 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /templates/socialaccount/authentication_error.html: -------------------------------------------------------------------------------- 1 | {% extends "socialaccount/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block head_title %}{% trans "Social Network Login Failure" %}{% endblock %} 6 | 7 | {% block content %} 8 |

{% trans "Social Network Login Failure" %}

9 | 10 |

{% trans "An error occurred while attempting to login via your social network account." %}

11 | {% endblock %} 12 | -------------------------------------------------------------------------------- /static/scss/free/_badges.scss: -------------------------------------------------------------------------------- 1 | // Badges 2 | .badge { 3 | box-shadow: $z-depth-1; 4 | border-radius: $border-radius-base; 5 | color: $white !important; 6 | } 7 | .badge-pill { 8 | border-radius: $badge-pill-border-radius; 9 | padding-right: $badge-pill-padding-x; 10 | padding-left: $badge-pill-padding-x; 11 | } 12 | @each $name, $color in $basic-mdb-colors { 13 | @include make-badge($name, $color); 14 | } 15 | -------------------------------------------------------------------------------- /static_in_env/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 | background-color: $footer-copyright-bg-color; 12 | color: $footer-copyright-color; 13 | } 14 | a { 15 | color: $white-base; 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /static_in_env/scss/free/_badges.scss: -------------------------------------------------------------------------------- 1 | // Badges 2 | .badge { 3 | box-shadow: $z-depth-1; 4 | border-radius: $border-radius-base; 5 | color: $white !important; 6 | } 7 | .badge-pill { 8 | border-radius: $badge-pill-border-radius; 9 | padding-right: $badge-pill-padding-x; 10 | padding-left: $badge-pill-padding-x; 11 | } 12 | @each $name, $color in $basic-mdb-colors { 13 | @include make-badge($name, $color); 14 | } 15 | -------------------------------------------------------------------------------- /templates/openid/login.html: -------------------------------------------------------------------------------- 1 | {% extends "openid/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block head_title %}OpenID Sign In{% endblock %} 6 | 7 | {% block content %} 8 | 9 |

{% trans 'OpenID Sign In' %}

10 | 11 | 12 |
13 | {% csrf_token %} 14 | {{form.as_p}} 15 | 16 |
17 | 18 | {% endblock %} 19 | -------------------------------------------------------------------------------- /core/migrations/0005_auto_20200626_1903.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.0.7 on 2020-06-26 13:03 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('core', '0004_item_description'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='item', 15 | name='slug', 16 | field=models.SlugField(unique=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /static/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; } -------------------------------------------------------------------------------- /static/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); -------------------------------------------------------------------------------- /static_in_env/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; } -------------------------------------------------------------------------------- /static_in_env/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); -------------------------------------------------------------------------------- /templates/account/password_set.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block head_title %}{% trans "Set Password" %}{% endblock %} 6 | 7 | {% block content %} 8 |

{% trans "Set Password" %}

9 | 10 |
11 | {% csrf_token %} 12 | {{ form.as_p }} 13 | 14 |
15 | {% endblock %} 16 | -------------------------------------------------------------------------------- /core/migrations/0003_auto_20200625_2024.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.0.7 on 2020-06-25 14:24 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('core', '0002_auto_20200625_2010'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='userprofile', 15 | name='on_click_purchasing', 16 | field=models.BooleanField(default=False), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /static/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 | -------------------------------------------------------------------------------- /templates/account/verification_sent.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block head_title %}{% trans "Verify Your E-mail Address" %}{% endblock %} 6 | 7 | {% block content %} 8 |

{% trans "Verify Your E-mail Address" %}

9 | 10 |

{% blocktrans %}We have sent an e-mail to you for verification. Follow the link provided to finalize the signup process. Please contact us if you do not receive it within a few minutes.{% endblocktrans %}

11 | 12 | {% endblock %} 13 | -------------------------------------------------------------------------------- /static/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; } -------------------------------------------------------------------------------- /static_in_env/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 | -------------------------------------------------------------------------------- /static_in_env/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; } -------------------------------------------------------------------------------- /static/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 | border: none; 12 | background-color: transparent; 13 | font-weight: 500; 14 | } 15 | } 16 | .form-control { 17 | margin: 0; 18 | padding: $input-group-form-control-py $input-group-form-control-px; 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /templates/any_form.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 |
7 | {% csrf_token %} 8 | {{ form|crispy }} 9 | 12 |
13 |
14 |
15 |
16 |
17 |
-------------------------------------------------------------------------------- /static_in_env/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 | border: none; 12 | background-color: transparent; 13 | font-weight: 500; 14 | } 15 | } 16 | .form-control { 17 | margin: 0; 18 | padding: $input-group-form-control-py $input-group-form-control-px; 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /core/migrations/0004_item_description.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.0.7 on 2020-06-26 10:03 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('core', '0003_auto_20200625_2024'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='item', 15 | name='description', 16 | field=models.TextField(default='description'), 17 | preserve_default=False, 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /templates/socialaccount/login_cancelled.html: -------------------------------------------------------------------------------- 1 | {% extends "socialaccount/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block head_title %}{% trans "Login Cancelled" %}{% endblock %} 6 | 7 | {% block content %} 8 | 9 |

{% trans "Login Cancelled" %}

10 | 11 | {% url 'account_login' as login_url %} 12 | 13 |

{% blocktrans %}You decided to cancel logging in to our site using one of your existing accounts. If this was a mistake, please proceed to sign in.{% endblocktrans %}

14 | 15 | {% endblock %} 16 | -------------------------------------------------------------------------------- /templates/account/password_reset_done.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | {% load account %} 5 | 6 | {% block head_title %}{% trans "Password Reset" %}{% endblock %} 7 | 8 | {% block content %} 9 |

{% trans "Password Reset" %}

10 | 11 | {% if user.is_authenticated %} 12 | {% include "account/snippets/already_logged_in.html" %} 13 | {% endif %} 14 | 15 |

{% blocktrans %}We have sent you an e-mail. Please contact us if you do not receive it within a few minutes.{% endblocktrans %}

16 | {% endblock %} 17 | -------------------------------------------------------------------------------- /djangoecommerce/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.conf import settings 3 | from django.conf.urls.static import static 4 | from django.urls import path, include 5 | 6 | from core import views 7 | 8 | urlpatterns = [ 9 | path('admin/', admin.site.urls), 10 | path('accounts/', include('allauth.urls')), 11 | path('', include('core.urls')), 12 | ] 13 | 14 | if settings.DEBUG: 15 | urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) 16 | urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 17 | -------------------------------------------------------------------------------- /templates/account/logout.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block head_title %}{% trans "Sign Out" %}{% endblock %} 6 | 7 | {% block content %} 8 |

{% trans "Sign Out" %}

9 | 10 |

{% trans 'Are you sure you want to sign out?' %}

11 | 12 |
13 | {% csrf_token %} 14 | {% if redirect_field_value %} 15 | 16 | {% endif %} 17 | 18 |
19 | 20 | 21 | {% endblock %} 22 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | 4 | 5 | def main(): 6 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoecommerce.settings') 7 | try: 8 | from django.core.management import execute_from_command_line 9 | except ImportError as exc: 10 | raise ImportError( 11 | "Couldn't import Django. Are you sure it's installed and " 12 | "available on your PYTHONPATH environment variable? Did you " 13 | "forget to activate a virtual environment?" 14 | ) from exc 15 | execute_from_command_line(sys.argv) 16 | 17 | 18 | if __name__ == '__main__': 19 | main() 20 | -------------------------------------------------------------------------------- /templates/script.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/account/email/email_confirmation_message.txt: -------------------------------------------------------------------------------- 1 | {% load account %}{% user_display user as user_display %}{% load i18n %}{% autoescape off %}{% blocktrans with site_name=current_site.name site_domain=current_site.domain %}Hello from {{ site_name }}! 2 | 3 | You're receiving this e-mail because user {{ user_display }} has given yours as an e-mail address to connect their account. 4 | 5 | To confirm this is correct, go to {{ activate_url }} 6 | {% endblocktrans %} 7 | {% blocktrans with site_name=current_site.name site_domain=current_site.domain %}Thank you from {{ site_name }}! 8 | {{ site_domain }}{% endblocktrans %} 9 | {% endautoescape %} 10 | -------------------------------------------------------------------------------- /static/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 | -------------------------------------------------------------------------------- /static/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); -------------------------------------------------------------------------------- /static_in_env/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 | -------------------------------------------------------------------------------- /static_in_env/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); -------------------------------------------------------------------------------- /templates/request_refund.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% load crispy_forms_tags %} 3 | {% block content %} 4 |
5 |
6 |
7 |
8 |
9 |
10 | {% csrf_token %} 11 | {{ form|crispy }} 12 | 15 |
16 |
17 |
18 |
19 |
20 |
21 | 22 | {% endblock %} -------------------------------------------------------------------------------- /static/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 | -------------------------------------------------------------------------------- /static_in_env/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 | -------------------------------------------------------------------------------- /core/migrations/0007_auto_20201206_1235.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.0.7 on 2020-12-06 06:35 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('core', '0006_comment'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='payment', 15 | name='ssl_charge_id', 16 | field=models.CharField(blank=True, max_length=50, null=True), 17 | ), 18 | migrations.AlterField( 19 | model_name='payment', 20 | name='stripe_charge_id', 21 | field=models.CharField(blank=True, max_length=50, null=True), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /static/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-left-radius: $border-radius-base; 21 | border-bottom-right-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 | 35 | -------------------------------------------------------------------------------- /static_in_env/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-left-radius: $border-radius-base; 21 | border-bottom-right-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 | 35 | -------------------------------------------------------------------------------- /static/scss/free/_cards.scss: -------------------------------------------------------------------------------- 1 | // Cards 2 | .card { 3 | box-shadow: $z-depth-1; 4 | border: 0; 5 | font-weight: 400; 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 | color: $md-card-text-color; 24 | font-size: $md-card-font-size; 25 | font-weight: 400; 26 | } 27 | } 28 | .md-form { 29 | label { 30 | font-weight: 300; 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /static_in_env/scss/free/_cards.scss: -------------------------------------------------------------------------------- 1 | // Cards 2 | .card { 3 | box-shadow: $z-depth-1; 4 | border: 0; 5 | font-weight: 400; 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 | color: $md-card-text-color; 24 | font-size: $md-card-font-size; 25 | font-weight: 400; 26 | } 27 | } 28 | .md-form { 29 | label { 30 | font-weight: 300; 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /templates/account/email/password_reset_key_message.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %}{% autoescape off %}{% blocktrans with site_name=current_site.name site_domain=current_site.domain %}Hello from {{ site_name }}! 2 | 3 | You're receiving this e-mail because you or someone else has requested a password for your user account. 4 | It can be safely ignored if you did not request a password reset. Click the link below to reset your password.{% endblocktrans %} 5 | 6 | {{ password_reset_url }} 7 | 8 | {% if username %}{% blocktrans %}In case you forgot, your username is {{ username }}.{% endblocktrans %} 9 | 10 | {% endif %}{% blocktrans with site_name=current_site.name site_domain=current_site.domain %}Thank you for using {{ site_name }}! 11 | {{ site_domain }}{% endblocktrans %} 12 | {% endautoescape %} 13 | -------------------------------------------------------------------------------- /templates/account/password_change.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | {% load crispy_forms_tags %} 3 | {% load i18n %} 4 | 5 | {% block head_title %}{% trans "Change Password" %}{% endblock %} 6 | 7 | {% block content %} 8 |
9 |
10 |
11 |
12 |
13 |

{% trans "Change Password" %}

14 | 15 |
16 | {% csrf_token %} 17 | {{ form|crispy }} 18 | 19 |
20 |
21 |
22 |
23 |
24 |
25 | {% endblock %} -------------------------------------------------------------------------------- /static/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 | -------------------------------------------------------------------------------- /static_in_env/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 | -------------------------------------------------------------------------------- /templates/socialaccount/snippets/provider_list.html: -------------------------------------------------------------------------------- 1 | {% load socialaccount %} 2 | 3 | {% get_providers as socialaccount_providers %} 4 | 5 | {% for provider in socialaccount_providers %} 6 | {% if provider.id == "openid" %} 7 | {% for brand in provider.get_brands %} 8 |
  • 9 | {{brand.name}} 13 |
  • 14 | {% endfor %} 15 | {% endif %} 16 |
  • 17 | Sign in With {{provider.name}} 20 |
  • 21 | {% endfor %} 22 | -------------------------------------------------------------------------------- /static/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 | -------------------------------------------------------------------------------- /static_in_env/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 | -------------------------------------------------------------------------------- /static/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 | -------------------------------------------------------------------------------- /templates/socialaccount/signup.html: -------------------------------------------------------------------------------- 1 | {% extends "socialaccount/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block head_title %}{% trans "Signup" %}{% endblock %} 6 | 7 | {% block content %} 8 |

    {% trans "Sign Up" %}

    9 | 10 |

    {% blocktrans with provider_name=account.get_provider.name site_name=site.name %}You are about to use your {{provider_name}} account to login to 11 | {{site_name}}. As a final step, please complete the following form:{% endblocktrans %}

    12 | 13 |
    14 | {% csrf_token %} 15 | {{ form.as_p }} 16 | {% if redirect_field_value %} 17 | 18 | {% endif %} 19 | 20 |
    21 | 22 | {% endblock %} 23 | -------------------------------------------------------------------------------- /static_in_env/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 | -------------------------------------------------------------------------------- /templates/account/verified_email_required.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block head_title %}{% trans "Verify Your E-mail Address" %}{% endblock %} 6 | 7 | {% block content %} 8 |

    {% trans "Verify Your E-mail Address" %}

    9 | 10 | {% url 'account_email' as email_url %} 11 | 12 |

    {% blocktrans %}This part of the site requires us to verify that 13 | you are who you claim to be. For this purpose, we require that you 14 | verify ownership of your e-mail address. {% endblocktrans %}

    15 | 16 |

    {% blocktrans %}We have sent an e-mail to you for 17 | verification. Please click on the link inside this e-mail. Please 18 | contact us if you do not receive it within a few minutes.{% endblocktrans %}

    19 | 20 |

    {% blocktrans %}Note: you can still change your e-mail address.{% endblocktrans %}

    21 | 22 | 23 | {% endblock %} 24 | -------------------------------------------------------------------------------- /templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {% include 'head.html' %} 5 | {% include 'navbar.html' %} 6 | 7 |
    8 | {% if messages %} 9 | {% for message in messages %} 10 | 16 | {% endfor %} 17 | {% endif %} 18 |
    19 | 20 | {% block content %} 21 | {% endblock %} 22 | 23 | {% block extra_body %} 24 | {% endblock %} 25 | 26 | {% include 'script.html' %} 27 | {% block extra_scripts %} 28 | {% endblock extra_scripts %} 29 | 30 | 31 | -------------------------------------------------------------------------------- /static/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)) -------------------------------------------------------------------------------- /static_in_env/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)) -------------------------------------------------------------------------------- /templates/account/password_reset.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | {% load crispy_forms_tags %} 3 | 4 | {% load i18n %} 5 | {% load account %} 6 | 7 | {% block head_title %}{% trans "Password Reset" %}{% endblock %} 8 | 9 | {% block content %} 10 | 11 |

    {% trans "Password Reset" %}

    12 | {% if user.is_authenticated %} 13 | {% include "account/snippets/already_logged_in.html" %} 14 | {% endif %} 15 | 16 |

    {% trans "Forgotten your password? Enter your e-mail address below, and we'll send you an e-mail allowing you to reset it." %}

    17 | 18 |
    19 | {% csrf_token %} 20 | {{ form|crispy }} 21 | 22 |
    23 | 24 |

    {% blocktrans %}Please contact us if you have any trouble resetting your password.{% endblocktrans %}

    25 | {% endblock %} 26 | -------------------------------------------------------------------------------- /templates/complete.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Document 9 | 10 | 11 |
    12 | {% if messages %} 13 | {% for message in messages %} 14 | 20 | {% endfor %} 21 | {% endif %} 22 |
    23 | 24 | -------------------------------------------------------------------------------- /core/migrations/0006_comment.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.0.7 on 2020-06-27 13:37 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 | dependencies = [ 11 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 12 | ('core', '0005_auto_20200626_1903'), 13 | ] 14 | 15 | operations = [ 16 | migrations.CreateModel( 17 | name='Comment', 18 | fields=[ 19 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 20 | ('comment', models.TextField()), 21 | ('date', models.DateTimeField(auto_now_add=True)), 22 | ('item', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Item')), 23 | ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), 24 | ], 25 | ), 26 | ] 27 | -------------------------------------------------------------------------------- /templates/account/password_reset_from_key.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | {% block head_title %}{% trans "Change Password" %}{% endblock %} 5 | 6 | {% block content %} 7 |

    {% if token_fail %}{% trans "Bad Token" %}{% else %}{% trans "Change Password" %}{% endif %}

    8 | 9 | {% if token_fail %} 10 | {% url 'account_reset_password' as passwd_reset_url %} 11 |

    {% blocktrans %}The password reset link was invalid, possibly because it has already been used. Please request a new password reset.{% endblocktrans %}

    12 | {% else %} 13 | {% if form %} 14 |
    15 | {% csrf_token %} 16 | {{ form.as_p }} 17 | 18 |
    19 | {% else %} 20 |

    {% trans 'Your password is now changed.' %}

    21 | {% endif %} 22 | {% endif %} 23 | {% endblock %} 24 | -------------------------------------------------------------------------------- /templates/account/email_confirm.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | {% load account %} 5 | 6 | {% block head_title %}{% trans "Confirm E-mail Address" %}{% endblock %} 7 | 8 | 9 | {% block content %} 10 |

    {% trans "Confirm E-mail Address" %}

    11 | 12 | {% if confirmation %} 13 | 14 | {% user_display confirmation.email_address.user as user_display %} 15 | 16 |

    {% blocktrans with confirmation.email_address.email as email %}Please confirm that {{ email }} is an e-mail address for user {{ user_display }}.{% endblocktrans %}

    17 | 18 |
    19 | {% csrf_token %} 20 | 21 |
    22 | 23 | {% else %} 24 | 25 | {% url 'account_email' as email_url %} 26 | 27 |

    {% blocktrans %}This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request.{% endblocktrans %}

    28 | 29 | {% endif %} 30 | 31 | {% endblock %} 32 | -------------------------------------------------------------------------------- /static/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 | -------------------------------------------------------------------------------- /static_in_env/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 | -------------------------------------------------------------------------------- /templates/account/signup.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | {% load i18n %} 3 | {% load crispy_forms_tags %} 4 | 5 | {% block head_title %}{% trans "Signup" %}{% endblock %} 6 | 7 | {% block content %} 8 |
    9 |
    10 |
    11 |
    12 |
    13 |

    {% trans "Sign Up" %}

    14 |

    {% blocktrans %}Already have an account? Then please sign in.{% endblocktrans %}

    15 | 23 |
    24 |
    25 |
    26 |
    27 |
    28 | {% endblock %} -------------------------------------------------------------------------------- /core/migrations/0002_auto_20200625_2010.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.0.7 on 2020-06-25 14:10 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 | dependencies = [ 11 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 12 | ('core', '0001_initial'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AlterField( 17 | model_name='item', 18 | name='likes', 19 | field=models.ManyToManyField(blank=True, to=settings.AUTH_USER_MODEL), 20 | ), 21 | migrations.CreateModel( 22 | name='UserProfile', 23 | fields=[ 24 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 25 | ('stripe_customer_id', models.CharField(blank=True, max_length=20, null=True)), 26 | ('on_click_purchasing', models.BooleanField()), 27 | ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), 28 | ], 29 | ), 30 | ] 31 | -------------------------------------------------------------------------------- /static/js/addons/progressBar.js: -------------------------------------------------------------------------------- 1 | (function ($) { 2 | $.fn.progressBar = function (givenValue) { 3 | const $this = $(this); 4 | 5 | function init(selector) { 6 | const progressValue = selector.children().attr('aria-valuenow'); 7 | selector.children().width(`${progressValue}%`); 8 | selector.children().html(''); 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 | -------------------------------------------------------------------------------- /static_in_env/js/addons/progressBar.js: -------------------------------------------------------------------------------- 1 | (function ($) { 2 | $.fn.progressBar = function (givenValue) { 3 | const $this = $(this); 4 | 5 | function init(selector) { 6 | const progressValue = selector.children().attr('aria-valuenow'); 7 | selector.children().width(`${progressValue}%`); 8 | selector.children().html(''); 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 | -------------------------------------------------------------------------------- /static/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} -------------------------------------------------------------------------------- /static_in_env/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} -------------------------------------------------------------------------------- /templates/head.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | 4 | 5 | 6 | 7 | 8 | {% block head_title %}{% endblock %} 9 | {% block extra_head %} 10 | {% endblock %} 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 48 | -------------------------------------------------------------------------------- /static/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 | border-radius: $carousel-indicators-border-radius; 19 | cursor: pointer; 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 | -------------------------------------------------------------------------------- /templates/category.html: -------------------------------------------------------------------------------- 1 | 35 | -------------------------------------------------------------------------------- /static_in_env/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 | border-radius: $carousel-indicators-border-radius; 19 | cursor: pointer; 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 | -------------------------------------------------------------------------------- /static/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 | justify-content: center; 12 | align-items: 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 | box-shadow: $z-depth-1; 56 | border-radius: $border-radius-base; 57 | background-color: $white-base; 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: - 0.25rem !important; 81 | } 82 | 83 | .flex-1 { 84 | flex: 1; 85 | } 86 | -------------------------------------------------------------------------------- /static_in_env/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 | justify-content: center; 12 | align-items: 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 | box-shadow: $z-depth-1; 56 | border-radius: $border-radius-base; 57 | background-color: $white-base; 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: - 0.25rem !important; 81 | } 82 | 83 | .flex-1 { 84 | flex: 1; 85 | } 86 | -------------------------------------------------------------------------------- /static/img/lightbox/default-skin.svg: -------------------------------------------------------------------------------- 1 | default-skin 2 -------------------------------------------------------------------------------- /static_in_env/img/lightbox/default-skin.svg: -------------------------------------------------------------------------------- 1 | default-skin 2 -------------------------------------------------------------------------------- /static/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 | left: 0; 11 | right: 0; 12 | bottom: 0; 13 | overflow: hidden; 14 | width: 100%; 15 | height: 100%; 16 | background-attachment: fixed; 17 | } 18 | img, video { 19 | position: relative; 20 | display: block; 21 | } 22 | video { 23 | &.video-intro { 24 | z-index: -100; 25 | top: 50%; 26 | left: 50%; 27 | transform: $intro-video-transform; 28 | transition: $intro-video-transition opacity; 29 | min-width: 100%; 30 | min-height: 100%; 31 | width: auto; 32 | height: auto; 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 | ); 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 | -------------------------------------------------------------------------------- /static_in_env/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 | left: 0; 11 | right: 0; 12 | bottom: 0; 13 | overflow: hidden; 14 | width: 100%; 15 | height: 100%; 16 | background-attachment: fixed; 17 | } 18 | img, video { 19 | position: relative; 20 | display: block; 21 | } 22 | video { 23 | &.video-intro { 24 | z-index: -100; 25 | top: 50%; 26 | left: 50%; 27 | transform: $intro-video-transform; 28 | transition: $intro-video-transition opacity; 29 | min-width: 100%; 30 | min-height: 100%; 31 | width: auto; 32 | height: auto; 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 | ); 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 | -------------------------------------------------------------------------------- /templates/socialaccount/connections.html: -------------------------------------------------------------------------------- 1 | {% extends "socialaccount/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block head_title %}{% trans "Account Connections" %}{% endblock %} 6 | 7 | {% block content %} 8 |

    {% trans "Account Connections" %}

    9 | 10 | {% if form.accounts %} 11 |

    {% blocktrans %}You can sign in to your account using any of the following third party accounts:{% endblocktrans %}

    12 | 13 | 14 |
    15 | {% csrf_token %} 16 | 17 |
    18 | {% if form.non_field_errors %} 19 |
    {{ form.non_field_errors }}
    20 | {% endif %} 21 | 22 | {% for base_account in form.accounts %} 23 | {% with base_account.get_provider_account as account %} 24 |
    25 | 30 |
    31 | {% endwith %} 32 | {% endfor %} 33 | 34 |
    35 | 36 |
    37 | 38 |
    39 | 40 |
    41 | 42 | {% else %} 43 |

    {% trans 'You currently have no social network accounts connected to this account.' %}

    44 | {% endif %} 45 | 46 |

    {% trans 'Add a 3rd Party Account' %}

    47 | 48 | 51 | 52 | {% include "socialaccount/snippets/login_extra.html" %} 53 | 54 | {% endblock %} 55 | -------------------------------------------------------------------------------- /static/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 | margin: 0; 29 | padding: 0; 30 | line-height: $table-label-height; 31 | height: $table-label-line-height; 32 | } 33 | &.btn-table { 34 | td { 35 | vertical-align: middle; 36 | } 37 | } 38 | } 39 | &.table-hover { 40 | tbody { 41 | tr { 42 | &:hover { 43 | transition: $table-hover-transition; 44 | background-color: $table-hover-background-color; 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 | -------------------------------------------------------------------------------- /static_in_env/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 | margin: 0; 29 | padding: 0; 30 | line-height: $table-label-height; 31 | height: $table-label-line-height; 32 | } 33 | &.btn-table { 34 | td { 35 | vertical-align: middle; 36 | } 37 | } 38 | } 39 | &.table-hover { 40 | tbody { 41 | tr { 42 | &:hover { 43 | transition: $table-hover-transition; 44 | background-color: $table-hover-background-color; 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 | -------------------------------------------------------------------------------- /templates/order_snippet.html: -------------------------------------------------------------------------------- 1 |
    2 |

    3 | Your cart 4 | {{ order.items.count }} 5 |

    6 | 30 | 31 | {% if DISPLAY_COUPON_FORM %} 32 |
    33 |

    Promo Code = Django

    34 | {% csrf_token %} 35 |
    36 | {{ coupon_form.coupon_code }} 37 |
    38 | 39 |
    40 |
    41 |
    42 | {% endif %} 43 | 44 |
    -------------------------------------------------------------------------------- /static/scss/mdb.lite.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Material Design for Bootstrap 4 3 | * Version: MDB Lite 4.8.7 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 | -------------------------------------------------------------------------------- /static_in_env/scss/mdb.lite.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Material Design for Bootstrap 4 3 | * Version: MDB Lite 4.8.7 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 | -------------------------------------------------------------------------------- /static/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 | -------------------------------------------------------------------------------- /static_in_env/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 | -------------------------------------------------------------------------------- /core/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from .views import (HomeView, ItemDetailView, add_to_cart, remove_from_the_cart, OrderSummary, 4 | remove_single_from_the_cart, CheckoutView, PaymentView, AddCouponView, 5 | RequestRefundView, add_likes_to_product, CustomerProfileView, add_comment_to_item, 6 | complete_payment 7 | ) 8 | 9 | app_name = 'core' 10 | 11 | urlpatterns = [ 12 | path('', 13 | HomeView.as_view(), name='item_list'), 14 | path('item_list//', 15 | HomeView.as_view(), name='item_list_by_category'), 16 | path('checkout/', 17 | CheckoutView.as_view(), name='checkout'), 18 | path('payment//', 19 | PaymentView.as_view(), name="payment"), 20 | path('products//', 21 | ItemDetailView.as_view(), name='products'), 22 | path('order_summary/', 23 | OrderSummary.as_view(), name='order_summary'), 24 | path('customer_profile/', 25 | CustomerProfileView.as_view(), name='customer_profile'), 26 | path('add_to_cart//', 27 | add_to_cart, name='add_to_cart'), 28 | path('remove_from_the_cart//', 29 | remove_from_the_cart, name='remove_from_the_cart'), 30 | path('remove_single_from_the_cart//', 31 | remove_single_from_the_cart, name='remove_single_from_the_cart'), 32 | path('add_coupon/', 33 | AddCouponView.as_view(), name="add_coupon"), 34 | path('request_refund/', 35 | RequestRefundView.as_view(), name="request_refund"), 36 | path('add_likes_to_product//', 37 | add_likes_to_product, name="likes"), 38 | path('add_comment_to_item//', 39 | add_comment_to_item, name="comments"), 40 | path('complete_payment///', 41 | complete_payment, name='complete_payment'), 42 | 43 | ] 44 | -------------------------------------------------------------------------------- /templates/navbar.html: -------------------------------------------------------------------------------- 1 | {% load cart_template_tags %} 2 | -------------------------------------------------------------------------------- /static/scss/mdb.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Material Design for Bootstrap 4 3 | * Version: MDB FREE 4.8.7 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 | -------------------------------------------------------------------------------- /static_in_env/scss/mdb.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Material Design for Bootstrap 4 3 | * Version: MDB FREE 4.8.7 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 | -------------------------------------------------------------------------------- /templates/footer.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | -------------------------------------------------------------------------------- /templates/account/login.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | {% load i18n %} 3 | {% load account socialaccount %} 4 | {% load crispy_forms_tags %} 5 | 6 | {% block head_title %}{% trans "Sign In" %}{% endblock %} 7 | 8 | {% block content %} 9 |
    10 |
    11 |
    12 |
    13 |
    14 |
    15 |

    {% trans "Sign In" %}

    16 | 17 | {% get_providers as socialaccount_providers %} 18 | 19 | 29 | 30 | 31 | {% if socialaccount_providers %} 32 |

    {% blocktrans with site.name as site_name %}Sign in with 33 | existing third party accounts. {% endblocktrans %}

    34 | 35 |
    36 | 37 |
      38 | {% include "socialaccount/snippets/provider_list.html" with process="login" %} 39 |
    40 | 41 | 42 | 43 |
    44 | 45 | {% include "socialaccount/snippets/login_extra.html" %} 46 | 47 | {% else %} 48 |

    {% blocktrans %}If you have not created an account yet, then please 49 | sign up first.{% endblocktrans %}

    50 | {% endif %} 51 |
    52 |
    53 |
    54 |
    55 |
    56 |
    57 | 58 | {% endblock %} -------------------------------------------------------------------------------- /static/scss/free/_pagination.scss: -------------------------------------------------------------------------------- 1 | // Pagination 2 | .pagination { 3 | .page-item { 4 | &.active { 5 | .page-link { 6 | box-shadow: $z-depth-1; 7 | transition: $pagination-active-transition; 8 | border-radius: $border-radius-base; 9 | background-color: $primary-color; 10 | color: $white-base; 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 | transition: $pagination-page-link-transition; 23 | outline: 0; 24 | border: 0; 25 | background-color: transparent; 26 | font-size: $pagination-page-link-font-size; 27 | color: $pagination-page-link-color; 28 | &:hover { 29 | transition: $pagination-page-link-transition; 30 | border-radius: $border-radius-base; 31 | background-color: $pagination-page-link-hover-bg-color; 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-left: $pagination-circle-margin-x; 57 | margin-right: $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 | -------------------------------------------------------------------------------- /static_in_env/scss/free/_pagination.scss: -------------------------------------------------------------------------------- 1 | // Pagination 2 | .pagination { 3 | .page-item { 4 | &.active { 5 | .page-link { 6 | box-shadow: $z-depth-1; 7 | transition: $pagination-active-transition; 8 | border-radius: $border-radius-base; 9 | background-color: $primary-color; 10 | color: $white-base; 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 | transition: $pagination-page-link-transition; 23 | outline: 0; 24 | border: 0; 25 | background-color: transparent; 26 | font-size: $pagination-page-link-font-size; 27 | color: $pagination-page-link-color; 28 | &:hover { 29 | transition: $pagination-page-link-transition; 30 | border-radius: $border-radius-base; 31 | background-color: $pagination-page-link-hover-bg-color; 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-left: $pagination-circle-margin-x; 57 | margin-right: $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 | -------------------------------------------------------------------------------- /templates/customer_profile.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% block content %} 3 |

    Order History

    4 |
    5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | {% for order in orders %} 19 | 20 | 21 | 29 | 30 | 31 | {% if order.refund_requested %} 32 | 33 | {% elif order.refund_granted %} 34 | 35 | {% else %} 36 | 37 | {% endif %} 38 | 39 | {% endfor %} 40 | 41 |
    OrderDateItemsTotal(BDT)Reference CodeRequest Refund
    {{forloop.counter}}{{order.ordered_date|date:'Y/m/d'}} 22 | {% for item in order.items.all %} 23 |
  • 24 | {{item}} 25 |
  • 26 | {% endfor %} 27 | 28 |
    {{order.payment.amount}}{{order.reference_code}}Refund RequestedRefund GrantedRefund
    42 | {% endblock content %} 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /core/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | 3 | from django_countries.fields import CountryField 4 | from django_countries.widgets import CountrySelectWidget 5 | 6 | from .models import Comment 7 | 8 | CHOICE_FIELDS = ( 9 | ('S', 'Stripe'), 10 | ('P', 'Paypal'), 11 | ) 12 | 13 | 14 | class CheckoutForm(forms.Form): 15 | # Shipping information 16 | shipping_address = forms.CharField(required=False) 17 | shipping_address2 = forms.CharField(required=False) 18 | shipping_country = CountryField(blank_label='(select country)').formfield( 19 | required=False, 20 | widget=CountrySelectWidget(attrs={ 21 | 'class': 'custom-select d-block w-100', 22 | })) 23 | shipping_zip = forms.CharField(required=False) 24 | same_billing_address = forms.BooleanField(required=False) 25 | set_default_shipping = forms.BooleanField(required=False) 26 | use_default_shipping = forms.BooleanField(required=False) 27 | 28 | # Billing information 29 | billing_address = forms.CharField(required=False) 30 | billing_address2 = forms.CharField(required=False) 31 | billing_country = CountryField(blank_label='(select country)').formfield( 32 | required=False, 33 | widget=CountrySelectWidget(attrs={ 34 | 'class': 'custom-select d-block w-100', 35 | })) 36 | billing_zip = forms.CharField(required=False) 37 | set_default_billing = forms.BooleanField(required=False) 38 | use_default_billing = forms.BooleanField(required=False) 39 | 40 | # Payment Method 41 | payment_option = forms.ChoiceField(widget=forms.RadioSelect, choices=CHOICE_FIELDS) 42 | 43 | 44 | class CouponForm(forms.Form): 45 | coupon_code = forms.CharField(widget=forms.TextInput(attrs={ 46 | 'class': "form-control", 47 | 'placeholder': 'Promo Code', 48 | 'aria-label': 'Recipient\'s username', 49 | 'aria-describedby':"basic-addon2" 50 | } 51 | )) 52 | 53 | 54 | class RefundForm(forms.Form): 55 | reference_code = forms.CharField(max_length=20) 56 | reason = forms.CharField(widget=forms.Textarea(attrs={ 57 | "row": 2 58 | })) 59 | email = forms.EmailField() 60 | 61 | 62 | class CommentForm(forms.Form): 63 | comment = forms.CharField(widget=forms.Textarea(attrs={ 64 | "cols": 200, 65 | "rows": 3, 66 | "class": "form-control", 67 | "placeholder": "Write A Comment" 68 | })) 69 | -------------------------------------------------------------------------------- /core/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import (Item, OrderItem, Cart, Address, Category, Comment, 3 | Payment, Coupon, Refund, UserProfile) 4 | 5 | admin.site.register(UserProfile) 6 | admin.site.register(Item) 7 | admin.site.register(Category) 8 | 9 | 10 | class OrderAdmin(admin.ModelAdmin): 11 | class Meta: 12 | model = OrderItem 13 | 14 | list_display = ["__str__", 'ordered'] 15 | 16 | 17 | admin.site.register(OrderItem, OrderAdmin) 18 | 19 | 20 | def update_refund_request_to_true(model_admin, request, query_set): 21 | query_set.update(refund_requested=False, refund_granted=True) 22 | 23 | 24 | update_refund_request_to_true.short_description_message = "Update orders to refund granted" 25 | 26 | 27 | class CartAdmin(admin.ModelAdmin): 28 | class Meta: 29 | model = Cart 30 | 31 | list_display = ['__str__', 32 | 'ordered', 33 | 'being_delivered', 34 | 'received', 35 | 'refund_requested', 36 | 'refund_granted', 37 | 'billing_address', 38 | 'shipping_address', 39 | 'payment', 40 | 'coupon' 41 | ] 42 | list_display_links = ['__str__', 43 | 'ordered', 44 | 'billing_address', 45 | 'shipping_address', 46 | 'payment', 47 | 'coupon' 48 | ] 49 | list_filter = ['ordered', 50 | 'being_delivered', 51 | 'received', 52 | 'refund_requested', 53 | 'refund_granted' 54 | ] 55 | search_fields = ['user__username', 'reference_code'] 56 | actions = [update_refund_request_to_true] 57 | 58 | 59 | admin.site.register(Cart, CartAdmin) 60 | admin.site.register(Address) 61 | admin.site.register(Payment) 62 | admin.site.register(Coupon) 63 | 64 | 65 | class RefundAdmin(admin.ModelAdmin): 66 | class Meta: 67 | model = Refund 68 | list_display = ['__str__', 'order'] 69 | 70 | 71 | admin.site.register(Refund, RefundAdmin) 72 | 73 | 74 | class CommentAdmin(admin.ModelAdmin): 75 | class Meta: 76 | model = Comment 77 | list_display = ['__str__', 'user'] 78 | 79 | 80 | admin.site.register(Comment, CommentAdmin) 81 | -------------------------------------------------------------------------------- /static/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) -------------------------------------------------------------------------------- /static_in_env/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) -------------------------------------------------------------------------------- /core/migrations/0008_alter_address_id_alter_cart_id_alter_category_id_and_more.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.1 on 2024-01-23 17:34 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('core', '0007_auto_20201206_1235'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='address', 15 | name='id', 16 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), 17 | ), 18 | migrations.AlterField( 19 | model_name='cart', 20 | name='id', 21 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), 22 | ), 23 | migrations.AlterField( 24 | model_name='category', 25 | name='id', 26 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), 27 | ), 28 | migrations.AlterField( 29 | model_name='comment', 30 | name='id', 31 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), 32 | ), 33 | migrations.AlterField( 34 | model_name='coupon', 35 | name='id', 36 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), 37 | ), 38 | migrations.AlterField( 39 | model_name='item', 40 | name='id', 41 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), 42 | ), 43 | migrations.AlterField( 44 | model_name='orderitem', 45 | name='id', 46 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), 47 | ), 48 | migrations.AlterField( 49 | model_name='payment', 50 | name='id', 51 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), 52 | ), 53 | migrations.AlterField( 54 | model_name='refund', 55 | name='id', 56 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), 57 | ), 58 | migrations.AlterField( 59 | model_name='userprofile', 60 | name='id', 61 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), 62 | ), 63 | ] 64 | -------------------------------------------------------------------------------- /static/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); -------------------------------------------------------------------------------- /static_in_env/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); -------------------------------------------------------------------------------- /templates/account/email.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block head_title %}{% trans "E-mail Addresses" %}{% endblock %} 6 | 7 | {% block content %} 8 |

    {% trans "E-mail Addresses" %}

    9 | {% if user.emailaddress_set.all %} 10 |

    {% trans 'The following e-mail addresses are associated with your account:' %}

    11 | 12 | 41 | 42 | {% else %} 43 |

    {% trans 'Warning:'%} {% trans "You currently do not have any e-mail address set up. You should really add an e-mail address so you can receive notifications, reset your password, etc." %}

    44 | 45 | {% endif %} 46 | 47 | 48 |

    {% trans "Add E-mail Address" %}

    49 | 50 |
    51 | {% csrf_token %} 52 | {{ form.as_p }} 53 | 54 |
    55 | 56 | {% endblock %} 57 | 58 | 59 | {% block extra_body %} 60 | 73 | {% endblock %} 74 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | media 2 | form.txt 3 | db.sqlite3 4 | credentials.txt 5 | ecom/ 6 | # Byte-compiled / optimized / DLL files 7 | __pycache__/ 8 | *.py[cod] 9 | *$py.class 10 | 11 | # C extensions 12 | *.so 13 | 14 | # Distribution / packaging 15 | .Python 16 | 17 | build/ 18 | develop-eggs/ 19 | dist/ 20 | downloads/ 21 | eggs/ 22 | .eggs/ 23 | lib/ 24 | lib64/ 25 | parts/ 26 | sdist/ 27 | var/ 28 | wheels/ 29 | share/python-wheels/ 30 | *.egg-info/ 31 | .installed.cfg 32 | *.egg 33 | MANIFEST 34 | 35 | # PyInstaller 36 | # Usually these files are written by a python script from a template 37 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 38 | *.manifest 39 | *.spec 40 | 41 | # Installer logs 42 | pip-log.txt 43 | pip-delete-this-directory.txt 44 | 45 | # Unit test / coverage reports 46 | htmlcov/ 47 | .tox/ 48 | .nox/ 49 | .coverage 50 | .coverage.* 51 | .cache 52 | nosetests.xml 53 | coverage.xml 54 | *.cover 55 | *.py,cover 56 | .hypothesis/ 57 | .pytest_cache/ 58 | cover/ 59 | 60 | # Translations 61 | *.mo 62 | *.pot 63 | 64 | # Django stuff: 65 | *.log 66 | local_settings.py 67 | db.sqlite3 68 | db.sqlite3-journal 69 | 70 | # Flask stuff: 71 | instance/ 72 | .webassets-cache 73 | 74 | # Scrapy stuff: 75 | .scrapy 76 | 77 | # Sphinx documentation 78 | docs/_build/ 79 | 80 | # PyBuilder 81 | .pybuilder/ 82 | target/ 83 | 84 | # Jupyter Notebook 85 | .ipynb_checkpoints 86 | 87 | # IPython 88 | profile_default/ 89 | ipython_config.py 90 | 91 | # pyenv 92 | # For a library or package, you might want to ignore these files since the code is 93 | # intended to run in multiple environments; otherwise, check them in: 94 | # .python-version 95 | 96 | # pipenv 97 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 98 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 99 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 100 | # install all needed dependencies. 101 | #Pipfile.lock 102 | 103 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 104 | __pypackages__/ 105 | 106 | # Celery stuff 107 | celerybeat-schedule 108 | celerybeat.pid 109 | 110 | # SageMath parsed files 111 | *.sage.py 112 | 113 | # Environments 114 | .venv 115 | env/ 116 | venv/ 117 | ENV/ 118 | env.bak/ 119 | venv.bak/ 120 | 121 | # Spyder project settings 122 | .spyderproject 123 | .spyproject 124 | 125 | # Rope project settings 126 | .ropeproject 127 | 128 | # mkdocs documentation 129 | /site 130 | 131 | # mypy 132 | .mypy_cache/ 133 | .dmypy.json 134 | dmypy.json 135 | 136 | # Pyre type checker 137 | .pyre/ 138 | 139 | # pytype static type analyzer 140 | .pytype/ 141 | 142 | # Cython debug symbols 143 | cython_debug/ 144 | .vscode -------------------------------------------------------------------------------- /templates/home-page.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% block content %} 3 | {% load static %} 4 | {% load pagination %} 5 |
    6 |
    7 | 8 | {% include 'category.html' %} 9 | 10 | 11 |
    12 | 13 | 14 |
    15 | {% for item in object_list %} 16 |
    17 | 18 |
    19 |
    20 | 22 | 23 |
    24 |
    25 |
    26 |
    27 | 28 |
    {{item.item_category}}
    29 |
    30 |
    31 | 32 | {{item.item_name}} 33 | 34 |
    35 | 36 |

    37 | {{item.price}} 38 |

    39 | 40 |
    41 | 42 |
    43 | 44 |
    45 | {% endfor %} 46 | {% if object_list.count == 0 %} 47 |
    48 |

    No items found

    49 |
    50 | {% endif %} 51 |
    52 |
    53 | 54 | 55 | 56 | {% if is_paginated %} 57 | 80 | {% endif %} 81 |
    82 |
    83 | 84 | {% endblock %} 85 | 86 | 87 | -------------------------------------------------------------------------------- /static/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 | -------------------------------------------------------------------------------- /static_in_env/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 | -------------------------------------------------------------------------------- /static/js/addons/jquery.zmd.hierarchical-display.min.js: -------------------------------------------------------------------------------- 1 | (function(i){"use strict";function t(t){return this.each(function(){var a=i(this),e=a.data("zmd.hierarchicalDisplay"),o=i.extend({},n.DEFAULTS,a.data(),"object"==typeof t&&t);return e||a.data("zmd.hierarchicalDisplay",e=new n(this,o)),"string"==typeof t?e[t]():o.action in e?e[o.action]():void 0})}var n=function(t,a){this.$element=i(t),this.$children=this.$element.children(),this.options=i.extend({},n.DEFAULTS,a),this._time=n.TRANSITION_DURATION*this.options.speed,this.init(),!0===this.options.debug&&this._debug()};n.VERSION="1.0.1",n.TRANSITION_DURATION=300,n.DEFAULTS={action:"show",speed:5,animationIn:"zoomedIn",animationOut:"zoomedOut",debug:!1},n.prototype.init=function(){var t,n,a,e=this,o=this.$element,s=this.$children,h=this.options,l=this._time;o.addClass("zmd-hierarchical-display"),s.each(function(){t=i(this).position(),n=.8*t.left+t.top,a=parseFloat(n/l).toFixed(2),i(this).css("-webkit-animation-delay",a+"s").css("animation-delay",a+"s")}),this._delay=a,s.last().on("webkitAnimationEnd animationend",function(){i(this).hasClass(h.animationOut)&&e._complete("hidden"),i(this).hasClass(h.animationIn)&&e._complete("shown")})},n.prototype.show=function(){var t=this.$element,n=(this.$children,this.options);t.hasClass("in")||t.hasClass("zmd-hierarchical-displaying")||(this._removeAnimations(),t.trigger(i.Event("show.zmd.hierarchicalDisplay")),this._addAnimation(n.animationIn))},n.prototype.hide=function(){var t=this.$element,n=(this.$children,this.options);"hidden"===t.css("visibility")||t.hasClass("zmd-hierarchical-displaying")||(this._removeAnimations(),t.trigger(i.Event("hide.zmd.hierarchicalDisplay")),this._addAnimation(n.animationOut))},n.prototype.toggle=function(){return this.$element.hasClass("in")?this.hide():this.show()},n.prototype._removeAnimations=function(){var t=this.options;this.$children.each(function(){i(this).removeClass(t.animationIn).removeClass(t.animationOut)})},n.prototype._addAnimation=function(t){this.$element.addClass("zmd-hierarchical-displaying"),this.$children.each(function(){i(this).addClass(t).addClass("animation")})},n.prototype._complete=function(t){this.$element.removeClass("zmd-hierarchical-displaying").toggleClass("in").trigger(i.Event(t+".zmd.hierarchicalDisplay"))},n.prototype._debug=function(){i(document).on("show.zmd.hierarchicalDisplay",function(i){console.log('Event "show.zmd.hierarchicalDisplay". For more information see:'),console.log(i)}).on("shown.zmd.hierarchicalDisplay",function(i){console.log('Event "shown.zmd.hierarchicalDisplay". For more information see:'),console.log(i)}).on("hide.zmd.hierarchicalDisplay",function(i){console.log('Event "hide.zmd.hierarchicalDisplay". For more information see:'),console.log(i)}).on("hidden.zmd.hierarchicalDisplay",function(i){console.log('Event "hidden.zmd.hierarchicalDisplay". For more information see:'),console.log(i)})},i.fn.hierarchicalDisplay=t,i.fn.hierarchicalDisplay.Constructor=n,i(document).on("ready",function(){i('[data-animation="hierarchical-display"]').each(function(){t.call(i(this))})}),i(document).on("click",'[data-toggle="hierarchical-display"]',function(n){var a=i(this),e=i(a.attr("data-target")||a.attr("href"));a.is("a")&&n.preventDefault(),t.call(e,"toggle")})})(jQuery); -------------------------------------------------------------------------------- /static_in_env/js/addons/jquery.zmd.hierarchical-display.min.js: -------------------------------------------------------------------------------- 1 | (function(i){"use strict";function t(t){return this.each(function(){var a=i(this),e=a.data("zmd.hierarchicalDisplay"),o=i.extend({},n.DEFAULTS,a.data(),"object"==typeof t&&t);return e||a.data("zmd.hierarchicalDisplay",e=new n(this,o)),"string"==typeof t?e[t]():o.action in e?e[o.action]():void 0})}var n=function(t,a){this.$element=i(t),this.$children=this.$element.children(),this.options=i.extend({},n.DEFAULTS,a),this._time=n.TRANSITION_DURATION*this.options.speed,this.init(),!0===this.options.debug&&this._debug()};n.VERSION="1.0.1",n.TRANSITION_DURATION=300,n.DEFAULTS={action:"show",speed:5,animationIn:"zoomedIn",animationOut:"zoomedOut",debug:!1},n.prototype.init=function(){var t,n,a,e=this,o=this.$element,s=this.$children,h=this.options,l=this._time;o.addClass("zmd-hierarchical-display"),s.each(function(){t=i(this).position(),n=.8*t.left+t.top,a=parseFloat(n/l).toFixed(2),i(this).css("-webkit-animation-delay",a+"s").css("animation-delay",a+"s")}),this._delay=a,s.last().on("webkitAnimationEnd animationend",function(){i(this).hasClass(h.animationOut)&&e._complete("hidden"),i(this).hasClass(h.animationIn)&&e._complete("shown")})},n.prototype.show=function(){var t=this.$element,n=(this.$children,this.options);t.hasClass("in")||t.hasClass("zmd-hierarchical-displaying")||(this._removeAnimations(),t.trigger(i.Event("show.zmd.hierarchicalDisplay")),this._addAnimation(n.animationIn))},n.prototype.hide=function(){var t=this.$element,n=(this.$children,this.options);"hidden"===t.css("visibility")||t.hasClass("zmd-hierarchical-displaying")||(this._removeAnimations(),t.trigger(i.Event("hide.zmd.hierarchicalDisplay")),this._addAnimation(n.animationOut))},n.prototype.toggle=function(){return this.$element.hasClass("in")?this.hide():this.show()},n.prototype._removeAnimations=function(){var t=this.options;this.$children.each(function(){i(this).removeClass(t.animationIn).removeClass(t.animationOut)})},n.prototype._addAnimation=function(t){this.$element.addClass("zmd-hierarchical-displaying"),this.$children.each(function(){i(this).addClass(t).addClass("animation")})},n.prototype._complete=function(t){this.$element.removeClass("zmd-hierarchical-displaying").toggleClass("in").trigger(i.Event(t+".zmd.hierarchicalDisplay"))},n.prototype._debug=function(){i(document).on("show.zmd.hierarchicalDisplay",function(i){console.log('Event "show.zmd.hierarchicalDisplay". For more information see:'),console.log(i)}).on("shown.zmd.hierarchicalDisplay",function(i){console.log('Event "shown.zmd.hierarchicalDisplay". For more information see:'),console.log(i)}).on("hide.zmd.hierarchicalDisplay",function(i){console.log('Event "hide.zmd.hierarchicalDisplay". For more information see:'),console.log(i)}).on("hidden.zmd.hierarchicalDisplay",function(i){console.log('Event "hidden.zmd.hierarchicalDisplay". For more information see:'),console.log(i)})},i.fn.hierarchicalDisplay=t,i.fn.hierarchicalDisplay.Constructor=n,i(document).on("ready",function(){i('[data-animation="hierarchical-display"]').each(function(){t.call(i(this))})}),i(document).on("click",'[data-toggle="hierarchical-display"]',function(n){var a=i(this),e=i(a.attr("data-target")||a.attr("href"));a.is("a")&&n.preventDefault(),t.call(e,"toggle")})})(jQuery); -------------------------------------------------------------------------------- /static/scss/free/_navbars.scss: -------------------------------------------------------------------------------- 1 | // Navbars 2 | .navbar { 3 | box-shadow: $z-depth-1; 4 | font-weight: $navbar-font-weight; 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 | margin: 0; 14 | padding: $navbar-breadcrumb-padding-top 0 0 $navbar-breadcrumb-padding-left; 15 | background-color: inherit; 16 | font-size: $navbar-double-font-size; 17 | font-weight: $navbar-font-weight; 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 | outline: 0; 30 | border-width: 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 | transition: $navbar-scrolling-transition; 88 | padding-top: $navbar-scrolling-padding; 89 | padding-bottom: $navbar-scrolling-padding; 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 | &.fixed-top, 100 | &.sticky-top { 101 | .navbar-collapse { 102 | @media (min-width: 400px) and (max-width: 767px), (min-width: 800px) and (max-width: 850px) { 103 | max-height: 340px; 104 | overflow-x: hidden; 105 | overflow-y: auto; 106 | } 107 | } 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /static_in_env/scss/free/_navbars.scss: -------------------------------------------------------------------------------- 1 | // Navbars 2 | .navbar { 3 | box-shadow: $z-depth-1; 4 | font-weight: $navbar-font-weight; 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 | margin: 0; 14 | padding: $navbar-breadcrumb-padding-top 0 0 $navbar-breadcrumb-padding-left; 15 | background-color: inherit; 16 | font-size: $navbar-double-font-size; 17 | font-weight: $navbar-font-weight; 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 | outline: 0; 30 | border-width: 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 | transition: $navbar-scrolling-transition; 88 | padding-top: $navbar-scrolling-padding; 89 | padding-bottom: $navbar-scrolling-padding; 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 | &.fixed-top, 100 | &.sticky-top { 101 | .navbar-collapse { 102 | @media (min-width: 400px) and (max-width: 767px), (min-width: 800px) and (max-width: 850px) { 103 | max-height: 340px; 104 | overflow-x: hidden; 105 | overflow-y: auto; 106 | } 107 | } 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /static/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} -------------------------------------------------------------------------------- /static_in_env/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} -------------------------------------------------------------------------------- /static/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 | animation: unset !important; 46 | transition: none !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 | -------------------------------------------------------------------------------- /static_in_env/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 | animation: unset !important; 46 | transition: none !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 | -------------------------------------------------------------------------------- /static/scss/core/_typography.scss: -------------------------------------------------------------------------------- 1 | // Typography 2 | 3 | // Roboto font 4 | @font-face { 5 | font-family: "Roboto"; 6 | src: local(Roboto Thin), 7 | url("#{$roboto-font-path}Roboto-Thin.eot"); 8 | src: url("#{$roboto-font-path}Roboto-Thin.eot?#iefix") format("embedded-opentype"), 9 | url("#{$roboto-font-path}Roboto-Thin.woff2") format("woff2"), 10 | url("#{$roboto-font-path}Roboto-Thin.woff") format("woff"), 11 | url("#{$roboto-font-path}Roboto-Thin.ttf") format("truetype"); 12 | font-weight: 200; 13 | } 14 | 15 | @font-face { 16 | font-family: "Roboto"; 17 | src: local(Roboto Light), 18 | url("#{$roboto-font-path}Roboto-Light.eot"); 19 | src: url("#{$roboto-font-path}Roboto-Light.eot?#iefix") format("embedded-opentype"), 20 | url("#{$roboto-font-path}Roboto-Light.woff2") format("woff2"), 21 | url("#{$roboto-font-path}Roboto-Light.woff") format("woff"), 22 | url("#{$roboto-font-path}Roboto-Light.ttf") format("truetype"); 23 | font-weight: 300; 24 | } 25 | 26 | @font-face { 27 | font-family: "Roboto"; 28 | src: local(Roboto Regular), 29 | url("#{$roboto-font-path}Roboto-Regular.eot"); 30 | src: url("#{$roboto-font-path}Roboto-Regular.eot?#iefix") format("embedded-opentype"), 31 | url("#{$roboto-font-path}Roboto-Regular.woff2") format("woff2"), 32 | url("#{$roboto-font-path}Roboto-Regular.woff") format("woff"), 33 | url("#{$roboto-font-path}Roboto-Regular.ttf") format("truetype"); 34 | font-weight: 400; 35 | } 36 | 37 | @font-face { 38 | font-family: "Roboto"; 39 | src: url("#{$roboto-font-path}Roboto-Medium.eot"); 40 | src: url("#{$roboto-font-path}Roboto-Medium.eot?#iefix") format("embedded-opentype"), 41 | url("#{$roboto-font-path}Roboto-Medium.woff2") format("woff2"), 42 | url("#{$roboto-font-path}Roboto-Medium.woff") format("woff"), 43 | url("#{$roboto-font-path}Roboto-Medium.ttf") format("truetype"); 44 | font-weight: 500; 45 | } 46 | 47 | @font-face { 48 | font-family: "Roboto"; 49 | src: url("#{$roboto-font-path}Roboto-Bold.eot"); 50 | src: url("#{$roboto-font-path}Roboto-Bold.eot?#iefix") format("embedded-opentype"), 51 | url("#{$roboto-font-path}Roboto-Bold.woff2") format("woff2"), 52 | url("#{$roboto-font-path}Roboto-Bold.woff") format("woff"), 53 | url("#{$roboto-font-path}Roboto-Bold.ttf") format("truetype"); 54 | font-weight: 700; 55 | } 56 | 57 | // General properties 58 | body { 59 | font-family: $mdb-font-family; 60 | font-weight: $font-weight-light; 61 | } 62 | 63 | h1, h2, h3, h4, h5, h6 { 64 | font-weight: $font-weight-light; 65 | } 66 | 67 | // Blockquote 68 | .blockquote { 69 | padding: $blockquote-padding-y $blockquote-padding-x; 70 | border-left: .25rem solid #eceeef; 71 | &.text-right { 72 | border-left: none; 73 | border-right: .25rem solid #eceeef; 74 | } 75 | .bq-title { 76 | margin-bottom: 0; 77 | font-size: $font-size-large; 78 | font-weight: 400; 79 | } 80 | p { 81 | padding: $blockquote-p-padding-y 0; 82 | font-size: $blockquote-p-font-size; 83 | } 84 | } 85 | 86 | @each $name, $color in $basic { 87 | .bq-#{$name} { 88 | border-left: 3px solid $color !important; 89 | .bq-title { 90 | color: $color !important; 91 | } 92 | } 93 | } 94 | 95 | // Responsive headings 96 | @each $key, $val in $grid-breakpoints { 97 | @include media-breakpoint-up($key) { 98 | $y: map-get($responsive-headings, $key); 99 | @each $name, $value in $y { 100 | .#{$name}-responsive { 101 | font-size: $value; 102 | } 103 | } 104 | } 105 | } 106 | 107 | @each $name, $color in $basic-mdb-colors { 108 | @include text-emphasis-variant(".text-#{$name}", $color); 109 | } 110 | 111 | .font-small { 112 | font-size: $font-size-small; 113 | } 114 | -------------------------------------------------------------------------------- /static_in_env/scss/core/_typography.scss: -------------------------------------------------------------------------------- 1 | // Typography 2 | 3 | // Roboto font 4 | @font-face { 5 | font-family: "Roboto"; 6 | src: local(Roboto Thin), 7 | url("#{$roboto-font-path}Roboto-Thin.eot"); 8 | src: url("#{$roboto-font-path}Roboto-Thin.eot?#iefix") format("embedded-opentype"), 9 | url("#{$roboto-font-path}Roboto-Thin.woff2") format("woff2"), 10 | url("#{$roboto-font-path}Roboto-Thin.woff") format("woff"), 11 | url("#{$roboto-font-path}Roboto-Thin.ttf") format("truetype"); 12 | font-weight: 200; 13 | } 14 | 15 | @font-face { 16 | font-family: "Roboto"; 17 | src: local(Roboto Light), 18 | url("#{$roboto-font-path}Roboto-Light.eot"); 19 | src: url("#{$roboto-font-path}Roboto-Light.eot?#iefix") format("embedded-opentype"), 20 | url("#{$roboto-font-path}Roboto-Light.woff2") format("woff2"), 21 | url("#{$roboto-font-path}Roboto-Light.woff") format("woff"), 22 | url("#{$roboto-font-path}Roboto-Light.ttf") format("truetype"); 23 | font-weight: 300; 24 | } 25 | 26 | @font-face { 27 | font-family: "Roboto"; 28 | src: local(Roboto Regular), 29 | url("#{$roboto-font-path}Roboto-Regular.eot"); 30 | src: url("#{$roboto-font-path}Roboto-Regular.eot?#iefix") format("embedded-opentype"), 31 | url("#{$roboto-font-path}Roboto-Regular.woff2") format("woff2"), 32 | url("#{$roboto-font-path}Roboto-Regular.woff") format("woff"), 33 | url("#{$roboto-font-path}Roboto-Regular.ttf") format("truetype"); 34 | font-weight: 400; 35 | } 36 | 37 | @font-face { 38 | font-family: "Roboto"; 39 | src: url("#{$roboto-font-path}Roboto-Medium.eot"); 40 | src: url("#{$roboto-font-path}Roboto-Medium.eot?#iefix") format("embedded-opentype"), 41 | url("#{$roboto-font-path}Roboto-Medium.woff2") format("woff2"), 42 | url("#{$roboto-font-path}Roboto-Medium.woff") format("woff"), 43 | url("#{$roboto-font-path}Roboto-Medium.ttf") format("truetype"); 44 | font-weight: 500; 45 | } 46 | 47 | @font-face { 48 | font-family: "Roboto"; 49 | src: url("#{$roboto-font-path}Roboto-Bold.eot"); 50 | src: url("#{$roboto-font-path}Roboto-Bold.eot?#iefix") format("embedded-opentype"), 51 | url("#{$roboto-font-path}Roboto-Bold.woff2") format("woff2"), 52 | url("#{$roboto-font-path}Roboto-Bold.woff") format("woff"), 53 | url("#{$roboto-font-path}Roboto-Bold.ttf") format("truetype"); 54 | font-weight: 700; 55 | } 56 | 57 | // General properties 58 | body { 59 | font-family: $mdb-font-family; 60 | font-weight: $font-weight-light; 61 | } 62 | 63 | h1, h2, h3, h4, h5, h6 { 64 | font-weight: $font-weight-light; 65 | } 66 | 67 | // Blockquote 68 | .blockquote { 69 | padding: $blockquote-padding-y $blockquote-padding-x; 70 | border-left: .25rem solid #eceeef; 71 | &.text-right { 72 | border-left: none; 73 | border-right: .25rem solid #eceeef; 74 | } 75 | .bq-title { 76 | margin-bottom: 0; 77 | font-size: $font-size-large; 78 | font-weight: 400; 79 | } 80 | p { 81 | padding: $blockquote-p-padding-y 0; 82 | font-size: $blockquote-p-font-size; 83 | } 84 | } 85 | 86 | @each $name, $color in $basic { 87 | .bq-#{$name} { 88 | border-left: 3px solid $color !important; 89 | .bq-title { 90 | color: $color !important; 91 | } 92 | } 93 | } 94 | 95 | // Responsive headings 96 | @each $key, $val in $grid-breakpoints { 97 | @include media-breakpoint-up($key) { 98 | $y: map-get($responsive-headings, $key); 99 | @each $name, $value in $y { 100 | .#{$name}-responsive { 101 | font-size: $value; 102 | } 103 | } 104 | } 105 | } 106 | 107 | @each $name, $color in $basic-mdb-colors { 108 | @include text-emphasis-variant(".text-#{$name}", $color); 109 | } 110 | 111 | .font-small { 112 | font-size: $font-size-small; 113 | } 114 | -------------------------------------------------------------------------------- /static/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 | cursor: pointer; 107 | text-decoration: none; 108 | color: $link-color; 109 | transition: $transition-basic; 110 | &:hover { 111 | text-decoration: none; 112 | color: $link-hover-color; 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 | flex-direction: row; 131 | justify-content: center; 132 | align-items: center; 133 | display: flex; 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 | content: ""; 142 | height: 1.5px; 143 | flex: 1; 144 | height: $divider-height; 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 | } -------------------------------------------------------------------------------- /static_in_env/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 | cursor: pointer; 107 | text-decoration: none; 108 | color: $link-color; 109 | transition: $transition-basic; 110 | &:hover { 111 | text-decoration: none; 112 | color: $link-hover-color; 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 | flex-direction: row; 131 | justify-content: center; 132 | align-items: center; 133 | display: flex; 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 | content: ""; 142 | height: 1.5px; 143 | flex: 1; 144 | height: $divider-height; 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 | } --------------------------------------------------------------------------------