This commit is contained in:
2024-11-19 13:00:24 +07:00
commit 45e3c1f698
3462 changed files with 617437 additions and 0 deletions
+151
View File
@@ -0,0 +1,151 @@
# Django #
*.log
*.pot
*.pyc
__pycache__
db.sqlite3*
media
# Backup files #
*.bak
# If you are using PyCharm #
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# AWS User-specific
.idea/**/aws.xml
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# File-based project format
*.iws
# IntelliJ
out/
# JIRA plugin
atlassian-ide-plugin.xml
# Python #
*.py[cod]
*$py.class
# Distribution / packaging
.Python build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
.pytest_cache/
nosetests.xml
coverage.xml
*.cover
.hypothesis/
# Jupyter Notebook
.ipynb_checkpoints
# pyenv
.python-version
# celery
celerybeat-schedule.*
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
lokal/
/lokal
# mkdocs documentation
/site
# mypy
.mypy_cache/
# Sublime Text #
*.tmlanguage.cache
*.tmPreferences.cache
*.stTheme.cache
*.sublime-workspace
*.sublime-project
# sftp configuration file
sftp-config.json
# Package control specific files Package
Control.last-run
Control.ca-list
Control.ca-bundle
Control.system-ca-bundle
GitHub.sublime-settings
# Visual Studio Code #
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
.history
# Static
/static
# Media
/media
# Assets downloads
/assets_download
# Assets watermark
/assets_watermark
+42
View File
@@ -0,0 +1,42 @@
### DATA BISNIS SOLUSI : WEB TEMPLATE
#### Project Description
Django template yang akan menjadi base template untuk landing page ProIT Group.
#### Installation
# buat virtual python env :
python3 -m venv lokalenv.
# pindah ke virtual :
source lokalenv/bin/activated.
# install module :
pip install -r requierment --update.
#### Usage
```
#python manage.py migrate
#python manage.py collectstatic
#python manage.py createsuperuser
#python manage.py runserver
```
#### Features
landing page
admin console
```
-user : adminlokal
-pass : adminlokal
```
#### Contributing
#### License
Copyright@2024 Data Bisnis Solusi
#### Badges
#### Screenshots and GIFs
#### Documentation
#### Changelog
### Conclusion
View File
+8
View File
@@ -0,0 +1,8 @@
from django.contrib import admin
from about.models import *
# About Page Admin
admin.site.register(aboutPage)
# About page SEO admin
admin.site.register(aboutPageSEO)
+6
View File
@@ -0,0 +1,6 @@
from django.apps import AppConfig
class AboutConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'about'
+27
View File
@@ -0,0 +1,27 @@
from django import forms
from about.models import *
# About Page Form
class aboutPageForm(forms.ModelForm):
class Meta:
model = aboutPage
fields = '__all__'
widgets = {
'description' : forms.Textarea(attrs={'rows' : 4})
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field in self.fields.values():
field.widget.attrs['class'] = 'form-control'
# About Page SEO Form
class aboutPageSEOForm(forms.ModelForm):
class Meta:
model = aboutPageSEO
fields = '__all__'
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field in self.fields.values():
field.widget.attrs['class'] = 'form-control'
+35
View File
@@ -0,0 +1,35 @@
# Generated by Django 4.2.4 on 2023-08-31 14:00
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='aboutPageSEO',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('meta_title', models.CharField(blank=True, max_length=500, null=True)),
('meta_description', models.CharField(blank=True, max_length=1000, null=True)),
],
),
migrations.CreateModel(
name='teamSection',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('image', models.ImageField(upload_to='Teams/')),
('name', models.CharField(max_length=200)),
('position', models.CharField(max_length=200)),
('facebook', models.CharField(blank=True, max_length=500, null=True)),
('instagram', models.CharField(blank=True, max_length=500, null=True)),
('linkedin', models.CharField(blank=True, max_length=500, null=True)),
('whatsapp', models.CharField(blank=True, max_length=500, null=True)),
],
),
]
+32
View File
@@ -0,0 +1,32 @@
# Generated by Django 4.2.4 on 2023-08-31 14:28
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('about', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='aboutPage',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('subtitle', models.CharField(max_length=100)),
('title', models.CharField(max_length=300)),
('description', models.TextField()),
('button1_text', models.CharField(max_length=100)),
('button1_url', models.CharField(max_length=500)),
('button2_text', models.CharField(max_length=100)),
('button2_url', models.CharField(max_length=500)),
('button3_text', models.CharField(max_length=100)),
('button3_url', models.CharField(max_length=500)),
('years_of_experience', models.IntegerField()),
('image1', models.ImageField(upload_to='AboutPage/')),
('image2', models.ImageField(upload_to='AboutPage/')),
('image3', models.ImageField(upload_to='AboutPage/')),
],
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.4 on 2023-09-16 14:26
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('about', '0002_aboutpage'),
]
operations = [
migrations.AlterField(
model_name='aboutpage',
name='years_of_experience',
field=models.CharField(max_length=200),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.4 on 2023-09-16 14:27
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('about', '0003_alter_aboutpage_years_of_experience'),
]
operations = [
migrations.AlterField(
model_name='aboutpage',
name='years_of_experience',
field=models.IntegerField(),
),
]
@@ -0,0 +1,40 @@
# Generated by Django 4.2.4 on 2023-09-16 14:30
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('about', '0004_alter_aboutpage_years_of_experience'),
]
operations = [
migrations.RenameField(
model_name='aboutpage',
old_name='button1_text',
new_name='feature1',
),
migrations.RenameField(
model_name='aboutpage',
old_name='button2_text',
new_name='feature2',
),
migrations.RenameField(
model_name='aboutpage',
old_name='button3_text',
new_name='feature3',
),
migrations.RemoveField(
model_name='aboutpage',
name='button1_url',
),
migrations.RemoveField(
model_name='aboutpage',
name='button2_url',
),
migrations.RemoveField(
model_name='aboutpage',
name='button3_url',
),
]
@@ -0,0 +1,63 @@
# Generated by Django 4.2.4 on 2023-10-18 05:31
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('about', '0005_rename_button1_text_aboutpage_feature1_and_more'),
]
operations = [
migrations.AlterField(
model_name='aboutpage',
name='description',
field=models.TextField(blank=True, null=True),
),
migrations.AlterField(
model_name='aboutpage',
name='feature1',
field=models.CharField(blank=True, max_length=100, null=True),
),
migrations.AlterField(
model_name='aboutpage',
name='feature2',
field=models.CharField(blank=True, max_length=100, null=True),
),
migrations.AlterField(
model_name='aboutpage',
name='feature3',
field=models.CharField(blank=True, max_length=100, null=True),
),
migrations.AlterField(
model_name='aboutpage',
name='image1',
field=models.ImageField(blank=True, null=True, upload_to='AboutPage/'),
),
migrations.AlterField(
model_name='aboutpage',
name='image2',
field=models.ImageField(blank=True, null=True, upload_to='AboutPage/'),
),
migrations.AlterField(
model_name='aboutpage',
name='image3',
field=models.ImageField(blank=True, null=True, upload_to='AboutPage/'),
),
migrations.AlterField(
model_name='aboutpage',
name='subtitle',
field=models.CharField(blank=True, max_length=100, null=True),
),
migrations.AlterField(
model_name='aboutpage',
name='title',
field=models.CharField(blank=True, max_length=300, null=True),
),
migrations.AlterField(
model_name='aboutpage',
name='years_of_experience',
field=models.IntegerField(blank=True, null=True),
),
]
@@ -0,0 +1,16 @@
# Generated by Django 5.0.3 on 2024-11-19 03:52
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('about', '0006_alter_aboutpage_description_alter_aboutpage_feature1_and_more'),
]
operations = [
migrations.DeleteModel(
name='teamSection',
),
]
View File
+30
View File
@@ -0,0 +1,30 @@
from django.db import models
# About Page Model
class aboutPage(models.Model):
subtitle = models.CharField(max_length=100, blank=True, null=True)
title = models.CharField(max_length=300, blank=True, null=True)
description = models.TextField(blank=True, null=True)
feature1 = models.CharField(max_length=100, blank=True, null=True)
feature2 = models.CharField(max_length=100, blank=True, null=True)
feature3 = models.CharField(max_length=100, blank=True, null=True)
years_of_experience = models.IntegerField(blank=True, null=True)
image1 = models.ImageField(upload_to='AboutPage/', blank=True, null=True)
image2 = models.ImageField(upload_to='AboutPage/', blank=True, null=True)
image3 = models.ImageField(upload_to='AboutPage/', blank=True, null=True)
def __str__(self):
return self.title
class aboutPageSEO(models.Model):
meta_title = models.CharField(max_length=500, blank=True, null=True)
meta_description = models.CharField(max_length=1000, blank=True, null=True)
def __str__(self):
return self.meta_title
+3
View File
@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.
+6
View File
@@ -0,0 +1,6 @@
from django.urls import path
from about.views import *
urlpatterns = [
path('about-us/', aboutPageFront, name='aboutPageFront'),
]
+19
View File
@@ -0,0 +1,19 @@
from django.shortcuts import render
from about.models import *
from home.models import *
def aboutPageFront(request):
seo = aboutPageSEO.objects.first()
aboutpage = aboutPage.objects.first()
about = aboutSection.objects.first()
context = {
'seo' : seo,
'aboutpage' : aboutpage,
'about' : about,
}
return render(request, 'front/main/about.html', context)
def error_404(request, exception):
return render(request, 'error/404.html', status=404)
View File
+36
View File
@@ -0,0 +1,36 @@
from django.contrib import admin
from accounts.models import *
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
class UserAdmin(BaseUserAdmin):
list_display = (
'username',
'email',
'is_verified',
'role',
'created',
)
list_filter = (
'is_superuser',
'is_verified',
'created',
'role'
)
search_fields = ('username', 'email')
# Add the is_verified field to the fieldsets
fieldsets = (
(None, {'fields': ('username', 'password')}),
('Personal Info', {'fields': ('first_name', 'last_name', 'email', 'is_verified', 'role')}),
('Permissions', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}),
('Important dates', {'fields': ('last_login', 'date_joined')}),
)
# Register your User model with the modified UserAdmin class
admin.site.register(User, UserAdmin)
@admin.register(UserProfile)
class UserProfileAdmin(admin.ModelAdmin):
list_display = ('user', 'name', 'email', 'phone', 'profile_picture')
admin.site.register(PasswordResetToken)
+6
View File
@@ -0,0 +1,6 @@
from django.apps import AppConfig
class AccountsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'accounts'
+75
View File
@@ -0,0 +1,75 @@
from django import forms
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.forms import PasswordChangeForm
from accounts.models import *
# # # # # # # # # # # # # # # # # #
# User Profile Form #
# # # # # # # # # # # # # # # # # #
class UserProfileForm(forms.ModelForm):
role = forms.ChoiceField(choices=get_user_model().Role.choices, required=False)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if 'instance' in kwargs:
user = kwargs['instance'].user
self.fields['role'].initial = user.role
self.fields['role'].choices = get_user_model().Role.choices
class Meta:
model = UserProfile
fields = ('profile_picture', 'name', 'slug', 'role', 'email', 'phone', 'address', 'city', 'state', 'country', 'zipcode', 'facebook', 'instagram', 'linkedin')
widgets = {
'profile_picture': forms.ClearableFileInput(attrs={'class': 'form-control'}),
'name': forms.TextInput(attrs={'class': 'form-control'}),
'slug': forms.TextInput(attrs={'class': 'form-control', 'readonly': 'readonly'}),
'email': forms.EmailInput(attrs={'class': 'form-control'}),
'phone': forms.TextInput(attrs={'class': 'form-control'}),
'role': forms.Select(attrs={'class': 'form-select'}),
'address': forms.TextInput(attrs={'class': 'form-control'}),
'city': forms.TextInput(attrs={'class': 'form-control'}),
'state': forms.TextInput(attrs={'class': 'form-control'}),
'country': forms.TextInput(attrs={'class': 'form-control'}),
'zipcode': forms.TextInput(attrs={'class': 'form-control'}),
'facebook': forms.TextInput(attrs={'class': 'form-control'}),
'instagram': forms.TextInput(attrs={'class': 'form-control'}),
'linkedin': forms.TextInput(attrs={'class': 'form-control'}),
}
def save(self, commit=True):
instance = super().save(commit=False)
if commit:
user = instance.user
user.role = self.cleaned_data['role']
user.save()
instance.save()
return instance
# # # # # # # # # # # # # # # # # #
# User Creation Form #
# # # # # # # # # # # # # # # # # #
class CustomUserCreationForm(UserCreationForm):
name = forms.CharField(max_length=255)
email = forms.EmailField(widget=forms.EmailInput(attrs={'class': 'form-control'}))
role = forms.ChoiceField(choices=[], widget=forms.Select(attrs={'class': 'form-select'}))
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['role'].choices = get_user_model().Role.choices
class Meta:
model = get_user_model()
fields = ['name', 'username', 'password1', 'password2', 'email', 'role']
widgets = {
'name': forms.TextInput(attrs={'class': 'form-control'}),
'username': forms.TextInput(attrs={'class': 'form-control'}),
'password1': forms.PasswordInput(attrs={'class': 'form-control'}),
'password2': forms.PasswordInput(attrs={'class': 'form-control'}),
}
# # # # # # # # # # # # # # # # # #
# Password Form #
# # # # # # # # # # # # # # # # # #
class UserPasswordChangeForm(PasswordChangeForm):
class Meta:
model = User
+26
View File
@@ -0,0 +1,26 @@
from django.contrib.auth.models import BaseUserManager
class UserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
if not email :
raise ValueError('Users must have an email address')
email = self.normalize_email(email)
user = self.model(email=email,**extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, password , **extra_fields):
extra_fields.setdefault('is_superuser',True)
extra_fields.setdefault('is_staff',True)
extra_fields.setdefault('is_active',True)
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_active') is not True:
raise ValueError('Superuser must have is_active=True.')
return self.create_user(email,password,**extra_fields)
+65
View File
@@ -0,0 +1,65 @@
# Generated by Django 4.2.4 on 2023-08-31 05:40
from django.conf import settings
import django.contrib.auth.validators
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
initial = True
dependencies = [
('auth', '0012_alter_user_first_name_max_length'),
]
operations = [
migrations.CreateModel(
name='User',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')),
('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')),
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
('is_verified', models.BooleanField(default=False, verbose_name='Is Verified')),
('role', models.CharField(blank=True, choices=[('Admin', 'Admin'), ('Editor', 'Editor')], max_length=255, null=True, verbose_name='Role')),
('created', models.DateField(auto_now_add=True)),
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')),
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')),
],
options={
'verbose_name': 'user',
'verbose_name_plural': 'users',
'abstract': False,
},
),
migrations.CreateModel(
name='UserProfile',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('profile_picture', models.ImageField(blank=True, null=True, upload_to='user_pictures/')),
('name', models.CharField(blank=True, max_length=255, null=True)),
('slug', models.SlugField(blank=True, max_length=255, null=True)),
('email', models.EmailField(blank=True, max_length=255, null=True)),
('phone', models.CharField(blank=True, max_length=255, null=True)),
('address', models.CharField(blank=True, max_length=255, null=True)),
('city', models.CharField(blank=True, max_length=255, null=True)),
('state', models.CharField(blank=True, max_length=255, null=True)),
('country', models.CharField(blank=True, max_length=255, null=True)),
('zipcode', models.CharField(blank=True, max_length=255, null=True)),
('facebook', models.CharField(blank=True, max_length=500, null=True)),
('instagram', models.CharField(blank=True, max_length=500, null=True)),
('linkedin', models.CharField(blank=True, max_length=500, null=True)),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]
@@ -0,0 +1,27 @@
# Generated by Django 4.2.4 on 2023-09-17 18:12
import datetime
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import uuid
class Migration(migrations.Migration):
dependencies = [
('accounts', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='PasswordResetToken',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('token', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('expiration_time', models.DurationField(default=datetime.timedelta(seconds=3600))),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.4 on 2023-09-17 18:49
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('accounts', '0002_passwordresettoken'),
]
operations = [
migrations.AlterField(
model_name='passwordresettoken',
name='expiration_time',
field=models.DateTimeField(),
),
]
View File
+123
View File
@@ -0,0 +1,123 @@
from django.db import models
from django.contrib.auth.models import AbstractUser
from accounts.manager import UserManager
from django.contrib.auth.models import BaseUserManager
from django.utils.text import slugify
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.utils import timezone
import uuid
class User(AbstractUser):
class Role(models.TextChoices):
Admin = 'Admin',"Admin"
Editor = 'Editor',"Editor"
is_verified = models.BooleanField(default=False , verbose_name='Is Verified')
role = models.CharField(max_length=255, verbose_name='Role' , choices=Role.choices, blank=True, null=True)
created = models.DateField(auto_now_add=True)
base_role = Role.Admin
objects = UserManager()
def save(self, *args, **kwargs):
if not self.pk and not self.role:
self.role = self.base_role
return super().save(*args, **kwargs)
def __str__(self):
return self.username
# manager
class CustomerUserManager(BaseUserManager):
def get_queryset(self ,*args, **kwargs) :
reasult = super().get_queryset(*args, **kwargs)
return reasult.filter(role=User.Role.Editor)
def create_user(self, email, password=None, **extra_fields):
if not email :
raise ValueError('Users must have an email address')
email = self.normalize_email(email)
user = self.model(email=email,**extra_fields)
user.set_password(password)
user.save()
return user
# User Profile
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
profile_picture = models.ImageField(upload_to='user_pictures/', blank=True, null=True)
name = models.CharField(max_length=255, blank=True, null=True)
slug = models.SlugField(max_length=255, blank=True, null=True)
email = models.EmailField(max_length=255, blank=True, null=True)
phone = models.CharField(max_length=255, blank=True, null=True)
address = models.CharField(max_length=255, blank=True, null=True)
city = models.CharField(max_length=255, blank=True, null=True)
state = models.CharField(max_length=255, blank=True, null=True)
country = models.CharField(max_length=255, blank=True, null=True)
zipcode = models.CharField(max_length=255, blank=True, null=True)
facebook = models.CharField(max_length=500, blank=True, null=True)
instagram = models.CharField(max_length=500, blank=True, null=True)
linkedin = models.CharField(max_length=500, blank=True, null=True)
def save(self, *args, **kwargs):
if self.pk:
original_profile = UserProfile.objects.get(pk=self.pk)
if original_profile.user.email != self.email:
# Email has changed, update it in the associated User model
original_profile.user.email = self.email
original_profile.user.save()
self.slug = slugify(self.user.username)
super(UserProfile, self).save(*args, **kwargs)
def getUserImage(self):
image_url = ""
if self.profile_picture:
image_url = self.profile_picture.url
else:
image_url = "https://cdn-icons-png.flaticon.com/128/3135/3135715.png"
return image_url
def __str__(self):
return self.user.username
# Password reset token generate
class PasswordResetToken(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
token = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
created_at = models.DateTimeField(auto_now_add=True)
expiration_time = models.DateTimeField()
def __str__(self):
return str(self.token)
def is_expired(self):
now = timezone.now()
return now > self.expiration_time
# Signals
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(
user=instance,
email=instance.email,
name=instance.username,
slug=slugify(instance.username),
)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.userprofile.save()
# signals for User
@receiver(post_save, sender=User)
def create_customer_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.get_or_create(user=instance)
@receiver(post_save, sender=User)
def save_customer_profile(sender, instance, **kwargs):
if hasattr(instance, 'userprofile'):
instance.userprofile.save()
+31
View File
@@ -0,0 +1,31 @@
from django import template
from django.utils.timesince import timesince
import random
register = template.Library()
@register.filter
def add_class(field, css_class):
return field.as_widget(attrs={'class': css_class})
@register.filter
def add_name(field, atrname):
return field.as_widget(attrs={'name': atrname})
@register.filter
def mul(value, arg):
return value * arg
# Define a list of classes to choose from
CLASS_CHOICES = ["primary", "danger", "warning", "success"]
@register.filter
def random_class(value):
# Choose a random class from the list
return random.choice(CLASS_CHOICES)
@register.filter(name='attr')
def attr(field, attribute):
attr_name, attr_value = attribute.split('=')
attrs = {attr_name: attr_value}
return field.as_widget(attrs=attrs)
+3
View File
@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.
+16
View File
@@ -0,0 +1,16 @@
from django.urls import path
from accounts.views import *
urlpatterns = [
path('admin/users/user-list', usersList, name="userList"),
path('admin/user/create', createUser, name="createUser"),
path('admin/edit-profile/<int:id>', editUserProfile, name='editUserProfile'),
path('admin/user/change-password/<int:id>', changePassword, name='changePassword'),
path('admin/user/delete/<int:id>', deleteUser, name='deleteUser'),
path('forgot-password/', initiate_password_reset, name='initiate_password_reset'),
path('reset_password/<uuid:token>/', reset_password, name='reset_password'),
path('login/', logIn, name='logIn'),
path('logout/', LogOut, name='LogOut'),
]
+31
View File
@@ -0,0 +1,31 @@
# utils.py
from django.conf import settings
import uuid
from django.core.mail import send_mail
from django.utils import timezone
from .models import PasswordResetToken
from django.urls import reverse
from django.template.loader import render_to_string
from django.utils.html import strip_tags
from settings.models import websiteSetting
def generate_reset_token_and_send_email(user, request):
token = uuid.uuid4() # Generate a UUID4 token
expiration_time = timezone.now() + timezone.timedelta(hours=1)
reset_token = PasswordResetToken.objects.create(user=user, token=token, expiration_time=expiration_time)
reset_link = request.build_absolute_uri(reverse('reset_password', args=[str(reset_token.token)]))
website_settings = websiteSetting.objects.first()
subject = "Password Reset"
html_message = render_to_string('authenticate/email/password_reset_email.html', {
'user': user,
'reset_link': reset_link,
})
plain_message = strip_tags(html_message)
from_email = f'"{website_settings.name}" <{settings.EMAIL_HOST_USER}>'
recipient_list = [user.email]
# Send the email with HTML content
send_mail(subject, plain_message, from_email, recipient_list, html_message=html_message)
+223
View File
@@ -0,0 +1,223 @@
from django.shortcuts import render, redirect
from accounts.models import *
from django.http import Http404
from accounts.forms import *
from django.contrib import messages
from django.contrib.auth import update_session_auth_hash
from accounts.utils import *
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
from core.decorators import *
from django.conf import settings
# # # # # # # # # # # # # # # # # #
# Admin User List #
# # # # # # # # # # # # # # # # # #
@login_required(login_url='logIn')
@admin_role_required
def usersList(request):
users = UserProfile.objects.all()
context = {
'title': 'Users',
'users': users,
}
return render(request, 'authenticate/user/users.html', context)
# # # # # # # # # # # # # # # # # #
# Admin User Edit #
# # # # # # # # # # # # # # # # # #
@login_required(login_url='logIn')
@admin_role_required
def editUserProfile(request, id):
try:
profile = UserProfile.objects.get(id=id)
user = profile.user
except UserProfile.DoesNotExist:
raise Http404("User profile does not exist")
if request.method == 'POST':
form = UserProfileForm(request.POST, request.FILES, instance=profile)
if form.is_valid():
form.save()
messages.success(request, 'Profile updated successfully.')
return redirect('editUserProfile', user.id)
else:
form = UserProfileForm(instance=profile)
context = {
'title': 'Edit User Profile',
'form': form,
'profile': profile,
'user': user,
}
return render(request, 'authenticate/user/edit.html', context)
# # # # # # # # # # # # # # # # # #
# Admin User Create #
# # # # # # # # # # # # # # # # # #
@login_required(login_url='logIn')
@admin_role_required
def createUser(request):
if request.method == 'POST':
form = CustomUserCreationForm(request.POST)
if form.is_valid():
user = form.save(commit=False) # Prevent immediate save
user.role = form.cleaned_data['role'] # Set role from form
user.save() # Save User instance to DB
# Update or Create a profile for the user
UserProfile.objects.update_or_create(
user=user,
defaults={
'name': form.cleaned_data['name'],
'email': form.cleaned_data['email']
}
)
return redirect('userList')
else:
print(form.errors)
else:
form = CustomUserCreationForm()
context = {
'title': 'Create User',
'form': form,
}
return render(request, 'authenticate/user/create.html', context)
# # # # # # # # # # # # # # # # # #
# Admin User Password #
# # # # # # # # # # # # # # # # # #
@login_required(login_url='logIn')
@admin_role_required
def changePassword(request, id):
user = User.objects.get(id=id)
profile = UserProfile.objects.get(user=user)
if request.method == 'POST':
form = UserPasswordChangeForm(user, request.POST)
if form.is_valid():
user = form.save()
update_session_auth_hash(request, user)
messages.success(request, 'Password changed successfully.')
return redirect('changePassword', user.id)
else:
form = UserPasswordChangeForm(user)
context = {
'title': 'Change Password',
'form': form,
'profile': profile,
'user': user,
}
return render(request, 'authenticate/user/password.html', context)
# # # # # # # # # # # # # # # # # #
# Admin Delete User #
# # # # # # # # # # # # # # # # # #
@login_required(login_url='logIn')
@admin_role_required
def deleteUser(request, id):
try:
user = User.objects.get(id=id)
profile = UserProfile.objects.get(user=user)
user.delete()
profile.delete()
except User.DoesNotExist:
raise Http404("User does not exist")
return redirect('userList')
# # # # # # # # # # # # # # # # # #
# Reset Password #
# # # # # # # # # # # # # # # # # #
def initiate_password_reset(request):
if request.method == 'POST':
username = request.POST.get('username')
try:
user = User.objects.get(username=username)
generate_reset_token_and_send_email(user, request)
messages.success(request, 'An email has sent!')
return redirect('initiate_password_reset')
except User.DoesNotExist:
messages.warning(request, 'Invalid username!')
return redirect('initiate_password_reset')
context = {
'title' : 'Forgot Password'
}
return render(request, 'authenticate/auth/forgotpassword.html', context)
def reset_password(request, token):
try:
password_reset_token = PasswordResetToken.objects.get(token=token)
if password_reset_token.is_expired():
messages.warning(request, 'The password reset token has expired. Please initiate the password reset process again.')
return redirect('password_reset')
if request.method == 'POST':
new_password1 = request.POST.get('new_password1')
new_password2 = request.POST.get('new_password2')
if new_password1 == new_password2:
user = password_reset_token.user
user.set_password(new_password1)
user.save()
update_session_auth_hash(request, user)
password_reset_token.delete()
messages.success(request, 'Password reset successfully!')
return redirect('/')
else:
messages.warning(request, 'Passwords did not match. Please try again.')
return redirect('reset_password', token=token)
context = {
'title' : 'Reset Password'
}
return render(request, 'authenticate/auth/reset.html', context)
except PasswordResetToken.DoesNotExist:
messages.warning(request, 'Invalid token. Please ensure you have the correct link.')
return redirect('initiate_password_reset')
except Exception as e:
messages.warning(request, f'An error occurred: {str(e)}')
return redirect('/')
# # # # # # # # # # # # # # # # # #
# Login #
# # # # # # # # # # # # # # # # # #
def logIn(request):
if not request.user.is_authenticated:
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('login[password]')
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return redirect('adminHome')
else:
messages.warning(request, 'Invalid username or password!')
return redirect('logIn')
else:
demo_mode = True if 'core.middleware.middleware.DemoModeMiddleware' in settings.MIDDLEWARE else False
context = {
'title' : 'Log In',
'demo_mode' : demo_mode
}
return render(request, 'authenticate/auth/login.html', context)
else:
return redirect('adminHome')
# # # # # # # # # # # # # # # # # #
# LogOut #
# # # # # # # # # # # # # # # # # #
@login_required(login_url='signIn')
def LogOut(request):
logout(request)
messages.success(request, 'Logout successfully!')
return redirect('logIn')
def error_404(request, exception):
return render(request, 'error/404.html', status=404)
View File
+3
View File
@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.
+6
View File
@@ -0,0 +1,6 @@
from django.apps import AppConfig
class AdminappConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'adminapp'
View File
+3
View File
@@ -0,0 +1,3 @@
from django.db import models
# Create your models here.
+3
View File
@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.
+64
View File
@@ -0,0 +1,64 @@
from django.urls import path
from adminapp.views import *
urlpatterns = [
path('admin/dashboard', adminHome, name='adminHome'),
# Admin Project URLS
path('admin/projects', adminProjectList, name='adminProjectList'),
path('admin/project/create', adminProjectCreate, name='adminProjectCreate'),
path('admin/project/edit/<slug:slug>', adminProjectEdit, name='adminProjectEdit'),
path('admin/project/delete/<int:id>', adminProjectDelete, name='adminProjectDelete'),
# Admin Project Category URLS
path('admin/project-category', adminProjectCategoryList, name='adminProjectCategoryList'),
path('admin/project-category/create', adminProjectCategoryCreate, name='adminProjectCategoryCreate'),
path('admin/project-category/edit/<slug:slug>', adminProjectCategoryEdit, name='adminProjectCategoryEdit'),
path('admin/project-category/delete/<int:id>', adminProjectCategoryDelete, name='adminProjectCategoryDelete'),
# Admin Service URLS
path('admin/services', adminServiceList, name='adminServiceList'),
path('admin/service/create', adminServiceCreate, name='adminServiceCreate'),
path('admin/service/edit/<slug:slug>', adminServiceEdit, name='adminServiceEdit'),
path('admin/service/delete/<int:id>', adminServiceDelete, name='adminServiceDelete'),
# Admin Slider Element URLS
path('admin/element/sliders', adminSliderElementList, name='adminSliderElementList'),
path('admin/element/slider/create', adminSliderElementCreate, name='adminSliderElementCreate'),
path('admin/element/slider/edit/<int:id>', adminSliderElementEdit, name='adminSliderElementEdit'),
path('admin/element/slider/delete/<int:id>', adminSliderElementDelete, name='adminSliderElementDelete'),
# Admin Client Element URLS
path('admin/element/clients', adminClientElementList, name='adminClientElementList'),
path('admin/element/client/create', adminClientElementCreate, name='adminClientElementCreate'),
path('admin/element/client/edit/<int:id>', adminClientElementEdit, name='adminClientElementEdit'),
path('admin/element/client/delete/<int:id>', adminClientElementDelete, name='adminClientElementDelete'),
# Admin Contact URLS
path('admin/contacts', AdminContactList, name='AdminContactList'),
path('admin/contact/delete/<int:id>', AdminContactDelete, name='AdminContactDelete'),
# Admin Settings URLS
path('admin/settings/website-settings', AdminWebsiteSettings, name='AdminWebsiteSettings'),
path('admin/settings/header-footer', AdminHeaderFooterSettings, name='AdminHeaderFooterSettings'),
path('admin/settings/seo', AdminSEOSettings, name='AdminSEOSettings'),
# Admin Primary Menu URLS
path('admin/menus/primary-menu', AdminPrimaryMenuList, name='AdminPrimaryMenuList'),
path('admin/primary-menu/create', AdminPrimaryMenuCreate, name='AdminPrimaryMenuCreate'),
path('admin/primary-menu/edit/<int:id>', AdminPrimaryMenuEdit, name='AdminPrimaryMenuEdit'),
path('admin/primary-menu/delete/<int:id>', AdminPrimaryMenuDelete, name='AdminPrimaryMenuDelete'),
# Admin Sub Menu URLS
path('admin/menus/sub-menu', AdminSubMenuList, name='AdminSubMenuList'),
path('admin/sub-menu/create', AdminSubMenuCreate, name='AdminSubMenuCreate'),
path('admin/sub-menu/edit/<int:id>', AdminSubMenuEdit, name='AdminSubMenuEdit'),
path('admin/sub-menu/delete/<int:id>', AdminSubMenuDelete, name='AdminSubMenuDelete'),
# Admin Pages URLS
path('admin/pages/home-page', AdminHomePage, name='AdminHomePage'),
path('admin/pages/about-page', AdminAboutPage, name='AdminAboutPage'),
path('admin/pages/service-page', AdminServicePage, name='AdminServicePage'),
path('admin/pages/project-page', AdminProjectPage, name='AdminProjectPage'),
path('admin/pages/contact-page', AdminContactPage, name='AdminContactPage'),
]
+684
View File
@@ -0,0 +1,684 @@
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from core.decorators import admin_role_required, both_role_required
from home.models import *
from home.forms import *
from about.models import *
from about.forms import *
from contact.models import *
from contact.forms import *
from settings.models import *
from settings.forms import *
from menus.models import *
from menus.forms import *
from service.models import *
from service.forms import *
from project.models import *
from project.forms import *
# # # # # # # # # # # # # # # # # #
# Admin Home Page #
# # # # # # # # # # # # # # # # # #
@login_required(login_url='logIn')
@both_role_required
def adminHome(request):
services = serviceSection.objects.all()
projects = projectSection.objects.all()
clients = clientSection.objects.all()
contacts = Contact.objects.all().order_by('-created_at')
context = {
'title' : 'Dashboard',
'services': services,
'projects': projects,
'clients': clients,
'contacts' : contacts,
}
return render(request, 'dashboard/main/index.html', context)
# # # # # # # # # # # # # # # # # #
# Admin Project #
# # # # # # # # # # # # # # # # # #
@login_required(login_url='logIn')
@admin_role_required
def adminProjectList(request):
projects = projectSection.objects.all()
context = {
'title' : 'Projects',
'projects' : projects,
}
return render(request, 'dashboard/main/project/projects.html', context)
@login_required(login_url='logIn')
@admin_role_required
def adminProjectCreate(request):
if request.method == 'POST':
form = projectSectionForm(request.POST, request.FILES)
if form.is_valid():
form.save()
messages.success(request, 'Project created successfully!')
return redirect('adminProjectList')
else:
form = projectSectionForm()
context = {
'title' : 'Create Project',
'form' : form,
}
return render(request, 'dashboard/main/project/create.html', context)
@login_required(login_url='logIn')
@admin_role_required
def adminProjectEdit(request, slug):
project = get_object_or_404(projectSection, slug=slug)
if request.method == 'POST':
form = projectSectionForm(request.POST, request.FILES, instance=project)
if form.is_valid():
form.save()
messages.success(request, 'Project updated successfully!')
return redirect('adminProjectList')
else:
form = projectSectionForm(instance=project)
context = {
'title' : 'Edit Project',
'project' : project,
'form' : form,
}
return render(request, 'dashboard/main/project/edit.html', context)
@login_required(login_url='logIn')
@admin_role_required
def adminProjectDelete(request, id):
project = get_object_or_404(projectSection, id=id)
project.delete()
messages.warning(request, 'Project deleted!')
return redirect('adminProjectList')
# # # # # # # # # # # # # # # # # #
# Admin Project Categories #
# # # # # # # # # # # # # # # # # #
@login_required(login_url='logIn')
@admin_role_required
def adminProjectCategoryList(request):
categories = projectCategory.objects.all()
context = {
'title' : 'Project Categories',
'categories' : categories,
}
return render(request, 'dashboard/main/project/partial/category/categories.html', context)
@login_required(login_url='logIn')
@admin_role_required
def adminProjectCategoryCreate(request):
if request.method == 'POST':
form = projectCategoryForm(request.POST, request.FILES)
if form.is_valid():
form.save()
messages.success(request, 'Category created successfully!')
return redirect('adminProjectCategoryList')
else:
form = projectCategoryForm()
context = {
'title' : 'Create Project Category',
'form' : form,
}
return render(request, 'dashboard/main/project/partial/category/create.html', context)
@login_required(login_url='logIn')
@admin_role_required
def adminProjectCategoryEdit(request, slug):
category = get_object_or_404(projectCategory, slug=slug)
if request.method == 'POST':
form = projectCategoryForm(request.POST, request.FILES, instance=category)
if form.is_valid():
form.save()
messages.success(request, 'Category updated successfully!')
return redirect('adminProjectCategoryList')
else:
form = projectCategoryForm(instance=category)
context = {
'title' : 'Edit Project Category',
'category' : category,
'form' : form,
}
return render(request, 'dashboard/main/project/partial/category/edit.html', context)
@login_required(login_url='logIn')
@admin_role_required
def adminProjectCategoryDelete(request, id):
category = get_object_or_404(projectCategory, id=id)
category.delete()
messages.warning(request, 'Category deleted!')
return redirect('adminProjectCategoryList')
# # # # # # # # # # # # # # # # # #
# Admin Service #
# # # # # # # # # # # # # # # # # #
@login_required(login_url='logIn')
@admin_role_required
def adminServiceList(request):
services = serviceSection.objects.all()
context = {
'title' : 'Services',
'services' : services,
}
return render(request, 'dashboard/main/service/services.html', context)
@login_required(login_url='logIn')
@admin_role_required
def adminServiceCreate(request):
if request.method == 'POST':
form = serviceForm(request.POST, request.FILES)
if form.is_valid():
form.save()
messages.success(request, 'Service created successfully!')
return redirect('adminServiceList')
else:
form = serviceForm()
context = {
'title' : 'Create Service',
'form' : form,
}
return render(request, 'dashboard/main/service/create.html', context)
@login_required(login_url='logIn')
@admin_role_required
def adminServiceEdit(request, slug):
service = get_object_or_404(serviceSection, slug=slug)
if request.method == 'POST':
form = serviceForm(request.POST, request.FILES, instance=service)
if form.is_valid():
form.save()
messages.success(request, 'Service updated successfully!')
return redirect('adminServiceList')
else:
form = serviceForm(instance=service)
context = {
'title' : 'Edit Service',
'service' : service,
'form' : form,
}
return render(request, 'dashboard/main/service/edit.html', context)
@login_required(login_url='logIn')
@admin_role_required
def adminServiceDelete(request, id):
service = get_object_or_404(serviceSection, id=id)
service.delete()
messages.warning(request, 'Service deleted!')
return redirect('adminServiceList')
# # # # # # # # # # # # # # # # # #
# Admin Slider Element #
# # # # # # # # # # # # # # # # # #
@login_required(login_url='logIn')
@admin_role_required
def adminSliderElementList(request):
sliders = sliderSection.objects.all()
context = {
'title' : 'Sliders',
'sliders' : sliders,
}
return render(request, 'dashboard/main/elements/slider/sliders.html', context)
@login_required(login_url='logIn')
@admin_role_required
def adminSliderElementCreate(request):
if request.method == 'POST':
form = sliderForm(request.POST, request.FILES)
if form.is_valid():
form.save()
messages.success(request, 'Slider created successfully!')
return redirect('adminSliderElementList')
else:
form = sliderForm()
context = {
'title' : 'Create Slider',
'form' : form,
}
return render(request, 'dashboard/main/elements/slider/create.html', context)
@login_required(login_url='logIn')
@admin_role_required
def adminSliderElementEdit(request, id):
slider = get_object_or_404(sliderSection, id=id)
if request.method == 'POST':
form = sliderForm(request.POST, request.FILES, instance=slider)
if form.is_valid():
form.save()
messages.success(request, 'Slider updated successfully!')
return redirect('adminSliderElementList')
else:
form = sliderForm(instance=slider)
context = {
'title' : 'Edit Slider',
'form' : form,
'slider' : slider,
}
return render(request, 'dashboard/main/elements/slider/edit.html', context)
@login_required(login_url='logIn')
@admin_role_required
def adminSliderElementDelete(request, id):
slider = get_object_or_404(sliderSection, id=id)
slider.delete()
messages.warning(request, 'Slider deleted!')
return redirect('adminSliderElementList')
# # # # # # # # # # # # # # # # # #
# Admin Client Element #
# # # # # # # # # # # # # # # # # #
@login_required(login_url='logIn')
@admin_role_required
def adminClientElementList(request):
clients = clientSection.objects.all()
context = {
'title' : 'Clients',
'clients' : clients,
}
return render(request, 'dashboard/main/elements/client/clients.html', context)
@login_required(login_url='logIn')
@admin_role_required
def adminClientElementCreate(request):
if request.method == 'POST':
form = clientSectionForm(request.POST, request.FILES)
if form.is_valid():
form.save()
messages.success(request, 'Client created successfully!')
return redirect('adminClientElementList')
else:
form = clientSectionForm()
context = {
'title' : 'Create Client',
'form' : form,
}
return render(request, 'dashboard/main/elements/client/create.html', context)
@login_required(login_url='logIn')
@admin_role_required
def adminClientElementEdit(request, id):
client = get_object_or_404(clientSection, id=id)
if request.method == 'POST':
form = clientSectionForm(request.POST, request.FILES, instance=client)
if form.is_valid():
form.save()
messages.success(request, 'Client updated successfully!')
return redirect('adminClientElementList')
else:
form = clientSectionForm(instance=client)
context = {
'title' : 'Edit Client',
'form' : form,
'client' : client,
}
return render(request, 'dashboard/main/elements/client/edit.html', context)
@login_required(login_url='logIn')
@admin_role_required
def adminClientElementDelete(request, id):
client = get_object_or_404(clientSection, id=id)
client.delete()
messages.warning(request, 'Client deleted!')
return redirect('adminClientElementList')
# # # # # # # # # # # # # # # # # #
# Admin Contacts #
# # # # # # # # # # # # # # # # # #
@login_required(login_url='logIn')
@admin_role_required
def AdminContactList(request):
contacts = Contact.objects.all()
context = {
'title' : 'Contacts',
'contacts' : contacts,
}
return render(request, 'dashboard/main/form_data/contacts.html', context)
@login_required(login_url='logIn')
@admin_role_required
def AdminContactDelete(request, id):
contact = get_object_or_404(Contact, id=id)
contact.delete()
messages.warning(request, 'Contact deleted!')
return redirect('AdminContactList')
# # # # # # # # # # # # # # # # # #
# Admin Website Settings #
# # # # # # # # # # # # # # # # # #
@login_required(login_url='logIn')
@admin_role_required
def AdminWebsiteSettings(request):
setting = websiteSetting.objects.first()
if request.method == 'POST':
form = websiteSettingForm(request.POST, request.FILES, instance=setting)
if form.is_valid():
form.save()
messages.success(request, 'Settings updated successfully!')
return redirect('AdminWebsiteSettings')
else:
form = websiteSettingForm(instance=setting)
context = {
'title' : 'Website Settings',
'setting' : setting,
'form' : form,
}
return render(request, 'dashboard/main/setting/website.html', context)
@login_required(login_url='logIn')
@admin_role_required
def AdminHeaderFooterSettings(request):
hf = headerFooterSetting.objects.first()
if request.method == 'POST':
form = headerFooterSettingForm(request.POST, request.FILES, instance=hf)
if form.is_valid():
form.save()
messages.success(request, 'Header footer updated successfully!')
return redirect('AdminHeaderFooterSettings')
else:
form = headerFooterSettingForm(instance=hf)
context = {
'title' : 'Header Footer Settings',
'hf' : hf,
'form' : form,
}
return render(request, 'dashboard/main/setting/hf.html', context)
@login_required(login_url='logIn')
@admin_role_required
def AdminSEOSettings(request):
seo = SeoSetting.objects.first()
if request.method == 'POST':
form = SeoSettingForm(request.POST, request.FILES, instance=seo)
if form.is_valid():
form.save()
messages.success(request, 'SEO settings updated successfully!')
return redirect('AdminSEOSettings')
else:
form = SeoSettingForm(instance=seo)
context = {
'title' : 'SEO Settings',
'seo' : seo,
'form' : form,
}
return render(request, 'dashboard/main/setting/seo.html', context)
# # # # # # # # # # # # # # # # # #
# Admin Primary Menus #
# # # # # # # # # # # # # # # # # #
@login_required(login_url='logIn')
@admin_role_required
def AdminPrimaryMenuList(request):
menus = primaryMenu.objects.all()
context = {
'title' : 'Menus',
'menus' : menus,
}
return render(request, 'dashboard/main/menu/primary/menus.html', context)
@login_required(login_url='logIn')
@admin_role_required
def AdminPrimaryMenuCreate(request):
if request.method == 'POST':
form = primaryMenuForm(request.POST)
if form.is_valid():
order = form.cleaned_data['order']
if primaryMenu.objects.filter(order=order).exists():
form.add_error('order', 'A menu with this order already exists. Use a different order.')
else:
form.save()
messages.success(request, 'Menu created successfully!')
return redirect('AdminPrimaryMenuList')
else:
form = primaryMenuForm()
context = {
'title': 'Create Menu',
'form': form,
}
return render(request, 'dashboard/main/menu/primary/create.html', context)
@login_required(login_url='logIn')
@admin_role_required
def AdminPrimaryMenuEdit(request, id):
menu = get_object_or_404(primaryMenu, id=id)
if request.method == 'POST':
form = primaryMenuForm(request.POST, instance=menu)
if form.is_valid():
order = form.cleaned_data['order']
if primaryMenu.objects.filter(order=order).exclude(id=id).exists():
form.add_error('order', 'A menu with this order already exists. Use a different order.')
else:
form.save()
messages.success(request, 'Menu updated successfully!')
return redirect('AdminPrimaryMenuList')
else:
form = primaryMenuForm(instance=menu)
context = {
'title': 'Edit Menu',
'form': form,
'menu': menu,
}
return render(request, 'dashboard/main/menu/primary/edit.html', context)
@login_required(login_url='logIn')
@admin_role_required
def AdminPrimaryMenuDelete(request, id):
menu = get_object_or_404(primaryMenu, id=id)
menu.delete()
messages.warning(request, 'Menu deleted!')
return redirect('AdminPrimaryMenuList')
# # # # # # # # # # # # # # # # # #
# Admin Sub Menus #
# # # # # # # # # # # # # # # # # #
@login_required(login_url='logIn')
@admin_role_required
def AdminSubMenuList(request):
submenus = subMenu.objects.all()
context = {
'title' : 'Sub Menus',
'submenus' : submenus,
}
return render(request, 'dashboard/main/menu/sub/menus.html', context)
@login_required(login_url='logIn')
@admin_role_required
def AdminSubMenuCreate(request):
if request.method == 'POST':
form = subMenuForm(request.POST)
if form.is_valid():
form.save()
messages.success(request, 'Submenu created successfully!')
return redirect('AdminSubMenuList')
else:
form = subMenuForm()
context = {
'title': 'Create Submenu',
'form': form,
}
return render(request, 'dashboard/main/menu/sub/create.html', context)
@login_required(login_url='logIn')
@admin_role_required
def AdminSubMenuEdit(request, id):
submenu = get_object_or_404(subMenu, id=id)
if request.method == 'POST':
form = subMenuForm(request.POST, instance=submenu)
if form.is_valid():
form.save()
messages.success(request, 'Submenu updated successfully!')
return redirect('AdminSubMenuList')
else:
form = subMenuForm(instance=submenu)
context = {
'title': 'Edit Submenu',
'form': form,
'submenu': submenu,
}
return render(request, 'dashboard/main/menu/sub/edit.html', context)
@login_required(login_url='logIn')
@admin_role_required
def AdminSubMenuDelete(request, id):
submenu = get_object_or_404(subMenu, id=id)
submenu.delete()
messages.warning(request, 'Submenu deleted!')
return redirect('AdminSubMenuList')
# # # # # # # # # # # # # # # # # #
# Admin Page Edit #
# # # # # # # # # # # # # # # # # #
@login_required(login_url='logIn')
@admin_role_required
def AdminHomePage(request):
homeabout = aboutSection.objects.first()
homeSEO = homePageSEO.objects.first()
if request.method == 'POST':
if 'subtitle' in request.POST:
form = aboutSectionForm(request.POST, request.FILES, instance = homeabout)
if form.is_valid():
form.save()
messages.success(request, 'Home page updated successfully!')
return redirect('AdminHomePage')
elif 'meta_title' in request.POST:
SeoForm = homePageSEOForm(request.POST, request.FILES, instance = homeSEO)
if SeoForm.is_valid():
SeoForm.save()
messages.success(request, 'Home page seo updated successfully!')
return redirect('AdminHomePage')
else:
return redirect('AdminHomePage')
else:
form = aboutSectionForm(instance = homeabout)
SeoForm = homePageSEOForm(instance = homeSEO)
context ={
'title' : 'Home Page',
'form' : form,
'SeoForm' : SeoForm,
'homeabout' : homeabout,
}
return render(request, 'dashboard/main/pages/home.html', context)
@login_required(login_url='logIn')
@admin_role_required
def AdminAboutPage(request):
aboutSection = aboutPage.objects.first()
aboutSEO = aboutPageSEO.objects.first()
if request.method == 'POST':
if 'subtitle' in request.POST:
form = aboutPageForm(request.POST, request.FILES, instance=aboutSection)
if form.is_valid():
form.save()
messages.success(request, 'About page updated successfully!')
return redirect('AdminAboutPage')
elif 'meta_title' in request.POST:
SeoForm = aboutPageSEOForm(request.POST, request.FILES, instance = aboutSEO)
if SeoForm.is_valid():
SeoForm.save()
messages.success(request, 'About page seo updated successfully!')
return redirect('AdminAboutPage')
else:
return redirect('AdminAboutPage')
else:
form = aboutPageForm(instance=aboutSection)
SeoForm = aboutPageSEOForm(instance=aboutSEO)
context = {
'title' : 'About Page',
'form' : form,
'SeoForm' : SeoForm,
}
return render(request, 'dashboard/main/pages/about.html', context)
@login_required(login_url='logIn')
@admin_role_required
def AdminServicePage(request):
serviceSEO = servicePageSEO.objects.first()
if request.method == 'POST':
SeoForm = servicePageSEOForm(request.POST, instance = serviceSEO)
if SeoForm.is_valid():
SeoForm.save()
messages.success(request, 'Service page seo updated successfully!')
return redirect('AdminServicePage')
else:
SeoForm = servicePageSEOForm(instance = serviceSEO)
context = {
'title' : 'Service Page',
'SeoForm' : SeoForm,
}
return render(request, 'dashboard/main/pages/service.html', context)
@login_required(login_url='logIn')
@admin_role_required
def AdminProjectPage(request):
projectSEO = projectPageSEO.objects.first()
if request.method == 'POST':
SeoForm = projectPageSEOForm(request.POST, instance = projectSEO)
if SeoForm.is_valid():
SeoForm.save()
messages.success(request, 'Project page seo updated successfully!')
return redirect('AdminProjectPage')
else:
SeoForm = projectPageSEOForm(instance = projectSEO)
context = {
'title' : 'Project Page',
'SeoForm' : SeoForm,
}
return render(request, 'dashboard/main/pages/project.html', context)
@login_required(login_url='logIn')
@admin_role_required
def AdminContactPage(request):
contactSEO = contactPageSEO.objects.first()
if request.method == 'POST':
SeoForm = contactPageSEOForm(request.POST, instance = contactSEO)
if SeoForm.is_valid():
SeoForm.save()
messages.success(request, 'Contact page seo updated successfully!')
return redirect('AdminContactPage')
else:
SeoForm = contactPageSEOForm(instance = contactSEO)
context = {
'title' : 'Contact Page',
'SeoForm' : SeoForm,
}
return render(request, 'dashboard/main/pages/contact.html', context)
@login_required(login_url='logIn')
@admin_role_required
def AdminPolicyPage(request):
policy = Policy.objects.first()
if request.method == 'POST':
form = policyForm(request.POST, instance=policy)
if form.is_valid():
form.save()
messages.success(request, 'Privacy policy updated successfully')
return redirect('AdminPolicyPage')
else:
form = policyForm(instance=policy)
context = {
'title' : 'Policy Page',
'form' : form,
}
return render(request, 'dashboard/main/pages/policy.html', context)
# Error Page
def error_404(request, exception):
return render(request, 'error/404.html', status=404)
def error_500(request):
return render(request, 'error/500.html', status=500)
View File
+1
View File
@@ -0,0 +1 @@
{"version":3,"sources":[],"names":[],"mappings":"","file":"color-1.css"}
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+765
View File
@@ -0,0 +1,765 @@
body[data-aos-duration="50"] [data-aos], [data-aos][data-aos][data-aos-duration="50"] {
transition-duration: 50ms;
}
body[data-aos-delay="50"] [data-aos], [data-aos][data-aos][data-aos-delay="50"] {
transition-delay: 0;
}
body[data-aos-delay="50"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="50"].aos-animate {
transition-delay: 50ms;
}
body[data-aos-duration="100"] [data-aos], [data-aos][data-aos][data-aos-duration="100"] {
transition-duration: 100ms;
}
body[data-aos-delay="100"] [data-aos], [data-aos][data-aos][data-aos-delay="100"] {
transition-delay: 0;
}
body[data-aos-delay="100"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="100"].aos-animate {
transition-delay: 100ms;
}
body[data-aos-duration="150"] [data-aos], [data-aos][data-aos][data-aos-duration="150"] {
transition-duration: 150ms;
}
body[data-aos-delay="150"] [data-aos], [data-aos][data-aos][data-aos-delay="150"] {
transition-delay: 0;
}
body[data-aos-delay="150"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="150"].aos-animate {
transition-delay: 150ms;
}
body[data-aos-duration="200"] [data-aos], [data-aos][data-aos][data-aos-duration="200"] {
transition-duration: 200ms;
}
body[data-aos-delay="200"] [data-aos], [data-aos][data-aos][data-aos-delay="200"] {
transition-delay: 0;
}
body[data-aos-delay="200"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="200"].aos-animate {
transition-delay: 200ms;
}
body[data-aos-duration="250"] [data-aos], [data-aos][data-aos][data-aos-duration="250"] {
transition-duration: 250ms;
}
body[data-aos-delay="250"] [data-aos], [data-aos][data-aos][data-aos-delay="250"] {
transition-delay: 0;
}
body[data-aos-delay="250"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="250"].aos-animate {
transition-delay: 250ms;
}
body[data-aos-duration="300"] [data-aos], [data-aos][data-aos][data-aos-duration="300"] {
transition-duration: 300ms;
}
body[data-aos-delay="300"] [data-aos], [data-aos][data-aos][data-aos-delay="300"] {
transition-delay: 0;
}
body[data-aos-delay="300"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="300"].aos-animate {
transition-delay: 300ms;
}
body[data-aos-duration="350"] [data-aos], [data-aos][data-aos][data-aos-duration="350"] {
transition-duration: 350ms;
}
body[data-aos-delay="350"] [data-aos], [data-aos][data-aos][data-aos-delay="350"] {
transition-delay: 0;
}
body[data-aos-delay="350"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="350"].aos-animate {
transition-delay: 350ms;
}
body[data-aos-duration="400"] [data-aos], [data-aos][data-aos][data-aos-duration="400"] {
transition-duration: 400ms;
}
body[data-aos-delay="400"] [data-aos], [data-aos][data-aos][data-aos-delay="400"] {
transition-delay: 0;
}
body[data-aos-delay="400"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="400"].aos-animate {
transition-delay: 400ms;
}
body[data-aos-duration="450"] [data-aos], [data-aos][data-aos][data-aos-duration="450"] {
transition-duration: 450ms;
}
body[data-aos-delay="450"] [data-aos], [data-aos][data-aos][data-aos-delay="450"] {
transition-delay: 0;
}
body[data-aos-delay="450"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="450"].aos-animate {
transition-delay: 450ms;
}
body[data-aos-duration="500"] [data-aos], [data-aos][data-aos][data-aos-duration="500"] {
transition-duration: 500ms;
}
body[data-aos-delay="500"] [data-aos], [data-aos][data-aos][data-aos-delay="500"] {
transition-delay: 0;
}
body[data-aos-delay="500"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="500"].aos-animate {
transition-delay: 500ms;
}
body[data-aos-duration="550"] [data-aos], [data-aos][data-aos][data-aos-duration="550"] {
transition-duration: 550ms;
}
body[data-aos-delay="550"] [data-aos], [data-aos][data-aos][data-aos-delay="550"] {
transition-delay: 0;
}
body[data-aos-delay="550"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="550"].aos-animate {
transition-delay: 550ms;
}
body[data-aos-duration="600"] [data-aos], [data-aos][data-aos][data-aos-duration="600"] {
transition-duration: 600ms;
}
body[data-aos-delay="600"] [data-aos], [data-aos][data-aos][data-aos-delay="600"] {
transition-delay: 0;
}
body[data-aos-delay="600"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="600"].aos-animate {
transition-delay: 600ms;
}
body[data-aos-duration="650"] [data-aos], [data-aos][data-aos][data-aos-duration="650"] {
transition-duration: 650ms;
}
body[data-aos-delay="650"] [data-aos], [data-aos][data-aos][data-aos-delay="650"] {
transition-delay: 0;
}
body[data-aos-delay="650"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="650"].aos-animate {
transition-delay: 650ms;
}
body[data-aos-duration="700"] [data-aos], [data-aos][data-aos][data-aos-duration="700"] {
transition-duration: 700ms;
}
body[data-aos-delay="700"] [data-aos], [data-aos][data-aos][data-aos-delay="700"] {
transition-delay: 0;
}
body[data-aos-delay="700"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="700"].aos-animate {
transition-delay: 700ms;
}
body[data-aos-duration="750"] [data-aos], [data-aos][data-aos][data-aos-duration="750"] {
transition-duration: 750ms;
}
body[data-aos-delay="750"] [data-aos], [data-aos][data-aos][data-aos-delay="750"] {
transition-delay: 0;
}
body[data-aos-delay="750"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="750"].aos-animate {
transition-delay: 750ms;
}
body[data-aos-duration="800"] [data-aos], [data-aos][data-aos][data-aos-duration="800"] {
transition-duration: 800ms;
}
body[data-aos-delay="800"] [data-aos], [data-aos][data-aos][data-aos-delay="800"] {
transition-delay: 0;
}
body[data-aos-delay="800"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="800"].aos-animate {
transition-delay: 800ms;
}
body[data-aos-duration="850"] [data-aos], [data-aos][data-aos][data-aos-duration="850"] {
transition-duration: 850ms;
}
body[data-aos-delay="850"] [data-aos], [data-aos][data-aos][data-aos-delay="850"] {
transition-delay: 0;
}
body[data-aos-delay="850"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="850"].aos-animate {
transition-delay: 850ms;
}
body[data-aos-duration="900"] [data-aos], [data-aos][data-aos][data-aos-duration="900"] {
transition-duration: 900ms;
}
body[data-aos-delay="900"] [data-aos], [data-aos][data-aos][data-aos-delay="900"] {
transition-delay: 0;
}
body[data-aos-delay="900"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="900"].aos-animate {
transition-delay: 900ms;
}
body[data-aos-duration="950"] [data-aos], [data-aos][data-aos][data-aos-duration="950"] {
transition-duration: 950ms;
}
body[data-aos-delay="950"] [data-aos], [data-aos][data-aos][data-aos-delay="950"] {
transition-delay: 0;
}
body[data-aos-delay="950"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="950"].aos-animate {
transition-delay: 950ms;
}
body[data-aos-duration="1000"] [data-aos], [data-aos][data-aos][data-aos-duration="1000"] {
transition-duration: 1000ms;
}
body[data-aos-delay="1000"] [data-aos], [data-aos][data-aos][data-aos-delay="1000"] {
transition-delay: 0;
}
body[data-aos-delay="1000"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="1000"].aos-animate {
transition-delay: 1000ms;
}
body[data-aos-duration="1050"] [data-aos], [data-aos][data-aos][data-aos-duration="1050"] {
transition-duration: 1050ms;
}
body[data-aos-delay="1050"] [data-aos], [data-aos][data-aos][data-aos-delay="1050"] {
transition-delay: 0;
}
body[data-aos-delay="1050"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="1050"].aos-animate {
transition-delay: 1050ms;
}
body[data-aos-duration="1100"] [data-aos], [data-aos][data-aos][data-aos-duration="1100"] {
transition-duration: 1100ms;
}
body[data-aos-delay="1100"] [data-aos], [data-aos][data-aos][data-aos-delay="1100"] {
transition-delay: 0;
}
body[data-aos-delay="1100"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="1100"].aos-animate {
transition-delay: 1100ms;
}
body[data-aos-duration="1150"] [data-aos], [data-aos][data-aos][data-aos-duration="1150"] {
transition-duration: 1150ms;
}
body[data-aos-delay="1150"] [data-aos], [data-aos][data-aos][data-aos-delay="1150"] {
transition-delay: 0;
}
body[data-aos-delay="1150"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="1150"].aos-animate {
transition-delay: 1150ms;
}
body[data-aos-duration="1200"] [data-aos], [data-aos][data-aos][data-aos-duration="1200"] {
transition-duration: 1200ms;
}
body[data-aos-delay="1200"] [data-aos], [data-aos][data-aos][data-aos-delay="1200"] {
transition-delay: 0;
}
body[data-aos-delay="1200"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="1200"].aos-animate {
transition-delay: 1200ms;
}
body[data-aos-duration="1250"] [data-aos], [data-aos][data-aos][data-aos-duration="1250"] {
transition-duration: 1250ms;
}
body[data-aos-delay="1250"] [data-aos], [data-aos][data-aos][data-aos-delay="1250"] {
transition-delay: 0;
}
body[data-aos-delay="1250"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="1250"].aos-animate {
transition-delay: 1250ms;
}
body[data-aos-duration="1300"] [data-aos], [data-aos][data-aos][data-aos-duration="1300"] {
transition-duration: 1300ms;
}
body[data-aos-delay="1300"] [data-aos], [data-aos][data-aos][data-aos-delay="1300"] {
transition-delay: 0;
}
body[data-aos-delay="1300"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="1300"].aos-animate {
transition-delay: 1300ms;
}
body[data-aos-duration="1350"] [data-aos], [data-aos][data-aos][data-aos-duration="1350"] {
transition-duration: 1350ms;
}
body[data-aos-delay="1350"] [data-aos], [data-aos][data-aos][data-aos-delay="1350"] {
transition-delay: 0;
}
body[data-aos-delay="1350"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="1350"].aos-animate {
transition-delay: 1350ms;
}
body[data-aos-duration="1400"] [data-aos], [data-aos][data-aos][data-aos-duration="1400"] {
transition-duration: 1400ms;
}
body[data-aos-delay="1400"] [data-aos], [data-aos][data-aos][data-aos-delay="1400"] {
transition-delay: 0;
}
body[data-aos-delay="1400"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="1400"].aos-animate {
transition-delay: 1400ms;
}
body[data-aos-duration="1450"] [data-aos], [data-aos][data-aos][data-aos-duration="1450"] {
transition-duration: 1450ms;
}
body[data-aos-delay="1450"] [data-aos], [data-aos][data-aos][data-aos-delay="1450"] {
transition-delay: 0;
}
body[data-aos-delay="1450"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="1450"].aos-animate {
transition-delay: 1450ms;
}
body[data-aos-duration="1500"] [data-aos], [data-aos][data-aos][data-aos-duration="1500"] {
transition-duration: 1500ms;
}
body[data-aos-delay="1500"] [data-aos], [data-aos][data-aos][data-aos-delay="1500"] {
transition-delay: 0;
}
body[data-aos-delay="1500"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="1500"].aos-animate {
transition-delay: 1500ms;
}
body[data-aos-duration="1550"] [data-aos], [data-aos][data-aos][data-aos-duration="1550"] {
transition-duration: 1550ms;
}
body[data-aos-delay="1550"] [data-aos], [data-aos][data-aos][data-aos-delay="1550"] {
transition-delay: 0;
}
body[data-aos-delay="1550"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="1550"].aos-animate {
transition-delay: 1550ms;
}
body[data-aos-duration="1600"] [data-aos], [data-aos][data-aos][data-aos-duration="1600"] {
transition-duration: 1600ms;
}
body[data-aos-delay="1600"] [data-aos], [data-aos][data-aos][data-aos-delay="1600"] {
transition-delay: 0;
}
body[data-aos-delay="1600"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="1600"].aos-animate {
transition-delay: 1600ms;
}
body[data-aos-duration="1650"] [data-aos], [data-aos][data-aos][data-aos-duration="1650"] {
transition-duration: 1650ms;
}
body[data-aos-delay="1650"] [data-aos], [data-aos][data-aos][data-aos-delay="1650"] {
transition-delay: 0;
}
body[data-aos-delay="1650"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="1650"].aos-animate {
transition-delay: 1650ms;
}
body[data-aos-duration="1700"] [data-aos], [data-aos][data-aos][data-aos-duration="1700"] {
transition-duration: 1700ms;
}
body[data-aos-delay="1700"] [data-aos], [data-aos][data-aos][data-aos-delay="1700"] {
transition-delay: 0;
}
body[data-aos-delay="1700"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="1700"].aos-animate {
transition-delay: 1700ms;
}
body[data-aos-duration="1750"] [data-aos], [data-aos][data-aos][data-aos-duration="1750"] {
transition-duration: 1750ms;
}
body[data-aos-delay="1750"] [data-aos], [data-aos][data-aos][data-aos-delay="1750"] {
transition-delay: 0;
}
body[data-aos-delay="1750"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="1750"].aos-animate {
transition-delay: 1750ms;
}
body[data-aos-duration="1800"] [data-aos], [data-aos][data-aos][data-aos-duration="1800"] {
transition-duration: 1800ms;
}
body[data-aos-delay="1800"] [data-aos], [data-aos][data-aos][data-aos-delay="1800"] {
transition-delay: 0;
}
body[data-aos-delay="1800"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="1800"].aos-animate {
transition-delay: 1800ms;
}
body[data-aos-duration="1850"] [data-aos], [data-aos][data-aos][data-aos-duration="1850"] {
transition-duration: 1850ms;
}
body[data-aos-delay="1850"] [data-aos], [data-aos][data-aos][data-aos-delay="1850"] {
transition-delay: 0;
}
body[data-aos-delay="1850"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="1850"].aos-animate {
transition-delay: 1850ms;
}
body[data-aos-duration="1900"] [data-aos], [data-aos][data-aos][data-aos-duration="1900"] {
transition-duration: 1900ms;
}
body[data-aos-delay="1900"] [data-aos], [data-aos][data-aos][data-aos-delay="1900"] {
transition-delay: 0;
}
body[data-aos-delay="1900"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="1900"].aos-animate {
transition-delay: 1900ms;
}
body[data-aos-duration="1950"] [data-aos], [data-aos][data-aos][data-aos-duration="1950"] {
transition-duration: 1950ms;
}
body[data-aos-delay="1950"] [data-aos], [data-aos][data-aos][data-aos-delay="1950"] {
transition-delay: 0;
}
body[data-aos-delay="1950"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="1950"].aos-animate {
transition-delay: 1950ms;
}
body[data-aos-duration="2000"] [data-aos], [data-aos][data-aos][data-aos-duration="2000"] {
transition-duration: 2000ms;
}
body[data-aos-delay="2000"] [data-aos], [data-aos][data-aos][data-aos-delay="2000"] {
transition-delay: 0;
}
body[data-aos-delay="2000"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="2000"].aos-animate {
transition-delay: 2000ms;
}
body[data-aos-duration="2050"] [data-aos], [data-aos][data-aos][data-aos-duration="2050"] {
transition-duration: 2050ms;
}
body[data-aos-delay="2050"] [data-aos], [data-aos][data-aos][data-aos-delay="2050"] {
transition-delay: 0;
}
body[data-aos-delay="2050"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="2050"].aos-animate {
transition-delay: 2050ms;
}
body[data-aos-duration="2100"] [data-aos], [data-aos][data-aos][data-aos-duration="2100"] {
transition-duration: 2100ms;
}
body[data-aos-delay="2100"] [data-aos], [data-aos][data-aos][data-aos-delay="2100"] {
transition-delay: 0;
}
body[data-aos-delay="2100"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="2100"].aos-animate {
transition-delay: 2100ms;
}
body[data-aos-duration="2150"] [data-aos], [data-aos][data-aos][data-aos-duration="2150"] {
transition-duration: 2150ms;
}
body[data-aos-delay="2150"] [data-aos], [data-aos][data-aos][data-aos-delay="2150"] {
transition-delay: 0;
}
body[data-aos-delay="2150"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="2150"].aos-animate {
transition-delay: 2150ms;
}
body[data-aos-duration="2200"] [data-aos], [data-aos][data-aos][data-aos-duration="2200"] {
transition-duration: 2200ms;
}
body[data-aos-delay="2200"] [data-aos], [data-aos][data-aos][data-aos-delay="2200"] {
transition-delay: 0;
}
body[data-aos-delay="2200"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="2200"].aos-animate {
transition-delay: 2200ms;
}
body[data-aos-duration="2250"] [data-aos], [data-aos][data-aos][data-aos-duration="2250"] {
transition-duration: 2250ms;
}
body[data-aos-delay="2250"] [data-aos], [data-aos][data-aos][data-aos-delay="2250"] {
transition-delay: 0;
}
body[data-aos-delay="2250"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="2250"].aos-animate {
transition-delay: 2250ms;
}
body[data-aos-duration="2300"] [data-aos], [data-aos][data-aos][data-aos-duration="2300"] {
transition-duration: 2300ms;
}
body[data-aos-delay="2300"] [data-aos], [data-aos][data-aos][data-aos-delay="2300"] {
transition-delay: 0;
}
body[data-aos-delay="2300"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="2300"].aos-animate {
transition-delay: 2300ms;
}
body[data-aos-duration="2350"] [data-aos], [data-aos][data-aos][data-aos-duration="2350"] {
transition-duration: 2350ms;
}
body[data-aos-delay="2350"] [data-aos], [data-aos][data-aos][data-aos-delay="2350"] {
transition-delay: 0;
}
body[data-aos-delay="2350"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="2350"].aos-animate {
transition-delay: 2350ms;
}
body[data-aos-duration="2400"] [data-aos], [data-aos][data-aos][data-aos-duration="2400"] {
transition-duration: 2400ms;
}
body[data-aos-delay="2400"] [data-aos], [data-aos][data-aos][data-aos-delay="2400"] {
transition-delay: 0;
}
body[data-aos-delay="2400"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="2400"].aos-animate {
transition-delay: 2400ms;
}
body[data-aos-duration="2450"] [data-aos], [data-aos][data-aos][data-aos-duration="2450"] {
transition-duration: 2450ms;
}
body[data-aos-delay="2450"] [data-aos], [data-aos][data-aos][data-aos-delay="2450"] {
transition-delay: 0;
}
body[data-aos-delay="2450"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="2450"].aos-animate {
transition-delay: 2450ms;
}
body[data-aos-duration="2500"] [data-aos], [data-aos][data-aos][data-aos-duration="2500"] {
transition-duration: 2500ms;
}
body[data-aos-delay="2500"] [data-aos], [data-aos][data-aos][data-aos-delay="2500"] {
transition-delay: 0;
}
body[data-aos-delay="2500"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="2500"].aos-animate {
transition-delay: 2500ms;
}
body[data-aos-duration="2550"] [data-aos], [data-aos][data-aos][data-aos-duration="2550"] {
transition-duration: 2550ms;
}
body[data-aos-delay="2550"] [data-aos], [data-aos][data-aos][data-aos-delay="2550"] {
transition-delay: 0;
}
body[data-aos-delay="2550"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="2550"].aos-animate {
transition-delay: 2550ms;
}
body[data-aos-duration="2600"] [data-aos], [data-aos][data-aos][data-aos-duration="2600"] {
transition-duration: 2600ms;
}
body[data-aos-delay="2600"] [data-aos], [data-aos][data-aos][data-aos-delay="2600"] {
transition-delay: 0;
}
body[data-aos-delay="2600"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="2600"].aos-animate {
transition-delay: 2600ms;
}
body[data-aos-duration="2650"] [data-aos], [data-aos][data-aos][data-aos-duration="2650"] {
transition-duration: 2650ms;
}
body[data-aos-delay="2650"] [data-aos], [data-aos][data-aos][data-aos-delay="2650"] {
transition-delay: 0;
}
body[data-aos-delay="2650"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="2650"].aos-animate {
transition-delay: 2650ms;
}
body[data-aos-duration="2700"] [data-aos], [data-aos][data-aos][data-aos-duration="2700"] {
transition-duration: 2700ms;
}
body[data-aos-delay="2700"] [data-aos], [data-aos][data-aos][data-aos-delay="2700"] {
transition-delay: 0;
}
body[data-aos-delay="2700"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="2700"].aos-animate {
transition-delay: 2700ms;
}
body[data-aos-duration="2750"] [data-aos], [data-aos][data-aos][data-aos-duration="2750"] {
transition-duration: 2750ms;
}
body[data-aos-delay="2750"] [data-aos], [data-aos][data-aos][data-aos-delay="2750"] {
transition-delay: 0;
}
body[data-aos-delay="2750"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="2750"].aos-animate {
transition-delay: 2750ms;
}
body[data-aos-duration="2800"] [data-aos], [data-aos][data-aos][data-aos-duration="2800"] {
transition-duration: 2800ms;
}
body[data-aos-delay="2800"] [data-aos], [data-aos][data-aos][data-aos-delay="2800"] {
transition-delay: 0;
}
body[data-aos-delay="2800"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="2800"].aos-animate {
transition-delay: 2800ms;
}
body[data-aos-duration="2850"] [data-aos], [data-aos][data-aos][data-aos-duration="2850"] {
transition-duration: 2850ms;
}
body[data-aos-delay="2850"] [data-aos], [data-aos][data-aos][data-aos-delay="2850"] {
transition-delay: 0;
}
body[data-aos-delay="2850"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="2850"].aos-animate {
transition-delay: 2850ms;
}
body[data-aos-duration="2900"] [data-aos], [data-aos][data-aos][data-aos-duration="2900"] {
transition-duration: 2900ms;
}
body[data-aos-delay="2900"] [data-aos], [data-aos][data-aos][data-aos-delay="2900"] {
transition-delay: 0;
}
body[data-aos-delay="2900"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="2900"].aos-animate {
transition-delay: 2900ms;
}
body[data-aos-duration="2950"] [data-aos], [data-aos][data-aos][data-aos-duration="2950"] {
transition-duration: 2950ms;
}
body[data-aos-delay="2950"] [data-aos], [data-aos][data-aos][data-aos-delay="2950"] {
transition-delay: 0;
}
body[data-aos-delay="2950"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="2950"].aos-animate {
transition-delay: 2950ms;
}
body[data-aos-duration="3000"] [data-aos], [data-aos][data-aos][data-aos-duration="3000"] {
transition-duration: 3000ms;
}
body[data-aos-delay="3000"] [data-aos], [data-aos][data-aos][data-aos-delay="3000"] {
transition-delay: 0;
}
body[data-aos-delay="3000"] [data-aos].aos-animate, [data-aos][data-aos][data-aos-delay="3000"].aos-animate {
transition-delay: 3000ms;
}
body[data-aos-easing=linear] [data-aos], [data-aos][data-aos][data-aos-easing=linear] {
transition-timing-function: cubic-bezier(0.25, 0.25, 0.75, 0.75);
}
body[data-aos-easing=ease] [data-aos], [data-aos][data-aos][data-aos-easing=ease] {
transition-timing-function: cubic-bezier(0.25, 0.1, 0.25, 1);
}
body[data-aos-easing=ease-in] [data-aos], [data-aos][data-aos][data-aos-easing=ease-in] {
transition-timing-function: cubic-bezier(0.42, 0, 1, 1);
}
body[data-aos-easing=ease-out] [data-aos], [data-aos][data-aos][data-aos-easing=ease-out] {
transition-timing-function: cubic-bezier(0, 0, 0.58, 1);
}
body[data-aos-easing=ease-in-out] [data-aos], [data-aos][data-aos][data-aos-easing=ease-in-out] {
transition-timing-function: cubic-bezier(0.42, 0, 0.58, 1);
}
body[data-aos-easing=ease-in-back] [data-aos], [data-aos][data-aos][data-aos-easing=ease-in-back] {
transition-timing-function: cubic-bezier(0.6, -0.28, 0.735, 0.045);
}
body[data-aos-easing=ease-out-back] [data-aos], [data-aos][data-aos][data-aos-easing=ease-out-back] {
transition-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1.275);
}
body[data-aos-easing=ease-in-out-back] [data-aos], [data-aos][data-aos][data-aos-easing=ease-in-out-back] {
transition-timing-function: cubic-bezier(0.68, -0.55, 0.265, 1.55);
}
body[data-aos-easing=ease-in-sine] [data-aos], [data-aos][data-aos][data-aos-easing=ease-in-sine] {
transition-timing-function: cubic-bezier(0.47, 0, 0.745, 0.715);
}
body[data-aos-easing=ease-out-sine] [data-aos], [data-aos][data-aos][data-aos-easing=ease-out-sine] {
transition-timing-function: cubic-bezier(0.39, 0.575, 0.565, 1);
}
body[data-aos-easing=ease-in-out-sine] [data-aos], [data-aos][data-aos][data-aos-easing=ease-in-out-sine] {
transition-timing-function: cubic-bezier(0.445, 0.05, 0.55, 0.95);
}
body[data-aos-easing=ease-in-quad] [data-aos], [data-aos][data-aos][data-aos-easing=ease-in-quad] {
transition-timing-function: cubic-bezier(0.55, 0.085, 0.68, 0.53);
}
body[data-aos-easing=ease-out-quad] [data-aos], [data-aos][data-aos][data-aos-easing=ease-out-quad] {
transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94);
}
body[data-aos-easing=ease-in-out-quad] [data-aos], [data-aos][data-aos][data-aos-easing=ease-in-out-quad] {
transition-timing-function: cubic-bezier(0.455, 0.03, 0.515, 0.955);
}
body[data-aos-easing=ease-in-cubic] [data-aos], [data-aos][data-aos][data-aos-easing=ease-in-cubic] {
transition-timing-function: cubic-bezier(0.55, 0.085, 0.68, 0.53);
}
body[data-aos-easing=ease-out-cubic] [data-aos], [data-aos][data-aos][data-aos-easing=ease-out-cubic] {
transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94);
}
body[data-aos-easing=ease-in-out-cubic] [data-aos], [data-aos][data-aos][data-aos-easing=ease-in-out-cubic] {
transition-timing-function: cubic-bezier(0.455, 0.03, 0.515, 0.955);
}
body[data-aos-easing=ease-in-quart] [data-aos], [data-aos][data-aos][data-aos-easing=ease-in-quart] {
transition-timing-function: cubic-bezier(0.55, 0.085, 0.68, 0.53);
}
body[data-aos-easing=ease-out-quart] [data-aos], [data-aos][data-aos][data-aos-easing=ease-out-quart] {
transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94);
}
body[data-aos-easing=ease-in-out-quart] [data-aos], [data-aos][data-aos][data-aos-easing=ease-in-out-quart] {
transition-timing-function: cubic-bezier(0.455, 0.03, 0.515, 0.955);
}
/**
* Fade animations:
* fade
* fade-up, fade-down, fade-left, fade-right
* fade-up-right, fade-up-left, fade-down-right, fade-down-left
*/
[data-aos^=fade][data-aos^=fade] {
opacity: 0;
transition-property: opacity, transform;
}
[data-aos^=fade][data-aos^=fade].aos-animate {
opacity: 1;
transform: translate(0, 0);
}
[data-aos=fade-up] {
transform: translate(0, 100px);
}
[data-aos=fade-down] {
transform: translate(0, -100px);
}
[data-aos=fade-right] {
transform: translate(-100px, 0);
}
[data-aos=fade-left] {
transform: translate(100px, 0);
}
[data-aos=fade-up-right] {
transform: translate(-100px, 100px);
}
[data-aos=fade-up-left] {
transform: translate(100px, 100px);
}
[data-aos=fade-down-right] {
transform: translate(-100px, -100px);
}
[data-aos=fade-down-left] {
transform: translate(100px, -100px);
}
/**
* Zoom animations:
* zoom-in, zoom-in-up, zoom-in-down, zoom-in-left, zoom-in-right
* zoom-out, zoom-out-up, zoom-out-down, zoom-out-left, zoom-out-right
*/
[data-aos^=zoom][data-aos^=zoom] {
opacity: 0;
transition-property: opacity, transform;
}
[data-aos^=zoom][data-aos^=zoom].aos-animate {
opacity: 1;
transform: translate(0, 0) scale(1);
}
[data-aos=zoom-in] {
transform: scale(0.6);
}
[data-aos=zoom-in-up] {
transform: translate(0, 100px) scale(0.6);
}
[data-aos=zoom-in-down] {
transform: translate(0, -100px) scale(0.6);
}
[data-aos=zoom-in-right] {
transform: translate(-100px, 0) scale(0.6);
}
[data-aos=zoom-in-left] {
transform: translate(100px, 0) scale(0.6);
}
[data-aos=zoom-out] {
transform: scale(1.2);
}
[data-aos=zoom-out-up] {
transform: translate(0, 100px) scale(1.2);
}
[data-aos=zoom-out-down] {
transform: translate(0, -100px) scale(1.2);
}
[data-aos=zoom-out-right] {
transform: translate(-100px, 0) scale(1.2);
}
[data-aos=zoom-out-left] {
transform: translate(100px, 0) scale(1.2);
}
/**
* Slide animations
*/
[data-aos^=slide][data-aos^=slide] {
transition-property: transform;
}
[data-aos^=slide][data-aos^=slide].aos-animate {
transform: translate(0, 0);
}
[data-aos=slide-up] {
transform: translateY(100%);
}
[data-aos=slide-down] {
transform: translateY(-100%);
}
[data-aos=slide-right] {
transform: translateX(-100%);
}
[data-aos=slide-left] {
transform: translateX(100%);
}
/**
* Flip animations:
* flip-left, flip-right, flip-up, flip-down
*/
[data-aos^=flip][data-aos^=flip] {
backface-visibility: hidden;
transition-property: transform;
}
[data-aos=flip-left] {
transform: perspective(2500px) rotateY(-100deg);
}
[data-aos=flip-left].aos-animate {
transform: perspective(2500px) rotateY(0);
}
[data-aos=flip-right] {
transform: perspective(2500px) rotateY(100deg);
}
[data-aos=flip-right].aos-animate {
transform: perspective(2500px) rotateY(0);
}
[data-aos=flip-up] {
transform: perspective(2500px) rotateX(-100deg);
}
[data-aos=flip-up].aos-animate {
transform: perspective(2500px) rotateX(0);
}
[data-aos=flip-down] {
transform: perspective(2500px) rotateX(100deg);
}
[data-aos=flip-down].aos-animate {
transform: perspective(2500px) rotateX(0);
}
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
@@ -0,0 +1,422 @@
/*!
* Bootstrap Reboot v5.0.2 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors
* Copyright 2011-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/
*,
*::before,
*::after {
box-sizing: border-box;
}
@media (prefers-reduced-motion: no-preference) {
:root {
scroll-behavior: smooth;
}
}
body {
margin: 0;
font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
color: #212529;
background-color: #fff;
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
hr {
margin: 1rem 0;
color: inherit;
background-color: currentColor;
border: 0;
opacity: 0.25;
}
hr:not([size]) {
height: 1px;
}
h6, h5, h4, h3, h2, h1 {
margin-top: 0;
margin-bottom: 0.5rem;
font-weight: 500;
line-height: 1.2;
}
h1 {
font-size: calc(1.375rem + 1.5vw);
}
@media (min-width: 1200px) {
h1 {
font-size: 2.5rem;
}
}
h2 {
font-size: calc(1.325rem + 0.9vw);
}
@media (min-width: 1200px) {
h2 {
font-size: 2rem;
}
}
h3 {
font-size: calc(1.3rem + 0.6vw);
}
@media (min-width: 1200px) {
h3 {
font-size: 1.75rem;
}
}
h4 {
font-size: calc(1.275rem + 0.3vw);
}
@media (min-width: 1200px) {
h4 {
font-size: 1.5rem;
}
}
h5 {
font-size: 1.25rem;
}
h6 {
font-size: 1rem;
}
p {
margin-top: 0;
margin-bottom: 1rem;
}
abbr[title],
abbr[data-bs-original-title] {
text-decoration: underline dotted;
cursor: help;
text-decoration-skip-ink: none;
}
address {
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
}
ol,
ul {
padding-left: 2rem;
}
ol,
ul,
dl {
margin-top: 0;
margin-bottom: 1rem;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin-bottom: 0;
}
dt {
font-weight: 700;
}
dd {
margin-bottom: 0.5rem;
margin-left: 0;
}
blockquote {
margin: 0 0 1rem;
}
b,
strong {
font-weight: bolder;
}
small {
font-size: 0.875em;
}
mark {
padding: 0.2em;
background-color: #fcf8e3;
}
sub,
sup {
position: relative;
font-size: 0.75em;
line-height: 0;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
a {
color: #0d6efd;
text-decoration: underline;
}
a:hover {
color: #0a58ca;
}
a:not([href]):not([class]), a:not([href]):not([class]):hover {
color: inherit;
text-decoration: none;
}
pre,
code,
kbd,
samp {
font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
font-size: 1em;
direction: ltr /* rtl:ignore */;
unicode-bidi: bidi-override;
}
pre {
display: block;
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
font-size: 0.875em;
}
pre code {
font-size: inherit;
color: inherit;
word-break: normal;
}
code {
font-size: 0.875em;
color: #d63384;
word-wrap: break-word;
}
a > code {
color: inherit;
}
kbd {
padding: 0.2rem 0.4rem;
font-size: 0.875em;
color: #fff;
background-color: #212529;
border-radius: 0.2rem;
}
kbd kbd {
padding: 0;
font-size: 1em;
font-weight: 700;
}
figure {
margin: 0 0 1rem;
}
img,
svg {
vertical-align: middle;
}
table {
caption-side: bottom;
border-collapse: collapse;
}
caption {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
color: #6c757d;
text-align: left;
}
th {
text-align: inherit;
text-align: -webkit-match-parent;
}
thead,
tbody,
tfoot,
tr,
td,
th {
border-color: inherit;
border-style: solid;
border-width: 0;
}
label {
display: inline-block;
}
button {
border-radius: 0;
}
button:focus:not(:focus-visible) {
outline: 0;
}
input,
button,
select,
optgroup,
textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button,
select {
text-transform: none;
}
[role=button] {
cursor: pointer;
}
select {
word-wrap: normal;
}
select:disabled {
opacity: 1;
}
[list]::-webkit-calendar-picker-indicator {
display: none;
}
button,
[type=button],
[type=reset],
[type=submit] {
-webkit-appearance: button;
}
button:not(:disabled),
[type=button]:not(:disabled),
[type=reset]:not(:disabled),
[type=submit]:not(:disabled) {
cursor: pointer;
}
::-moz-focus-inner {
padding: 0;
border-style: none;
}
textarea {
resize: vertical;
}
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
legend {
float: left;
width: 100%;
padding: 0;
margin-bottom: 0.5rem;
font-size: calc(1.275rem + 0.3vw);
line-height: inherit;
}
@media (min-width: 1200px) {
legend {
font-size: 1.5rem;
}
}
legend + * {
clear: left;
}
::-webkit-datetime-edit-fields-wrapper,
::-webkit-datetime-edit-text,
::-webkit-datetime-edit-minute,
::-webkit-datetime-edit-hour-field,
::-webkit-datetime-edit-day-field,
::-webkit-datetime-edit-month-field,
::-webkit-datetime-edit-year-field {
padding: 0;
}
::-webkit-inner-spin-button {
height: auto;
}
[type=search] {
outline-offset: -2px;
-webkit-appearance: textfield;
}
/* rtl:raw:
[type="tel"],
[type="url"],
[type="email"],
[type="number"] {
direction: ltr;
}
*/
::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-color-swatch-wrapper {
padding: 0;
}
::file-selector-button {
font: inherit;
}
::-webkit-file-upload-button {
font: inherit;
-webkit-appearance: button;
}
output {
display: inline-block;
}
iframe {
border: 0;
}
summary {
display: list-item;
cursor: pointer;
}
progress {
vertical-align: baseline;
}
[hidden] {
display: none !important;
}
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+471
View File
@@ -0,0 +1,471 @@
/**=====================
65. Button Builder color picker CSS Start
==========================**/
.button-builder .colorpicker {
width: 325px;
height: 176px;
overflow: hidden;
position: absolute;
display: none;
z-index: 8;
background: #2c323f;
border: 1px solid #ecf3fa;
}
.button-builder .colorpicker input {
background-color: transparent;
border: 1px solid transparent;
position: absolute;
font-size: 10px;
color: #ecf3fa;
top: 4px;
right: 11px;
text-align: right;
margin: 0;
padding: 0;
height: 11px;
}
.button-builder .colorpicker-color {
width: 150px;
height: 150px;
left: 14px;
top: 13px;
position: absolute;
background: #FC4438;
overflow: hidden;
cursor: crosshair;
}
.button-builder .colorpicker-color div {
position: absolute;
top: 0;
left: 0;
width: 150px;
height: 150px;
background: url(../images/button_builder/colorpicker_overlay.png);
}
.button-builder .colorpicker-color div div {
position: absolute;
top: 0;
left: 0;
width: 11px;
height: 11px;
overflow: hidden;
background: url(../images/button_builder/colorpicker_select.gif);
margin: -5px 0 0 -5px;
}
.button-builder .colorpicker-hue {
position: absolute;
top: 13px;
left: 171px;
width: 35px;
height: 150px;
cursor: n-resize;
}
.button-builder .colorpicker-hue div {
position: absolute;
width: 35px;
height: 9px;
overflow: hidden;
margin: -4px 0 0;
left: 0;
}
.button-builder .colorpicker-new-color {
position: absolute;
width: 60px;
height: 30px;
left: 213px;
top: 13px;
background: #FC4438;
}
.button-builder .colorpicker-current-color {
position: absolute;
width: 60px;
height: 30px;
left: 283px;
top: 13px;
background: #FC4438;
}
.button-builder .colorpicker-hex {
position: absolute;
width: 72px;
height: 22px;
left: 212px;
top: 142px;
}
.button-builder .colorpicker-hex input {
right: 6px;
}
.button-builder .colorpicker-hex.colorpicker-focus {
background-position: bottom;
}
.button-builder .colorpicker-field {
height: 22px;
width: 62px;
background-position: top;
position: absolute;
}
.button-builder .colorpicker-field span {
position: absolute;
width: 12px;
height: 22px;
overflow: hidden;
top: 0;
right: 0;
cursor: n-resize;
}
.button-builder .colorpicker-rgb-r {
top: 52px;
left: 212px;
}
.button-builder .colorpicker-rgb-g {
top: 82px;
left: 212px;
}
.button-builder .colorpicker-rgb-b {
top: 112px;
left: 212px;
}
.button-builder .colorpicker_hsb_h {
top: 52px;
left: 282px;
}
.button-builder .colorpicker_hsb_s {
top: 82px;
left: 282px;
}
.button-builder .colorpicker-hsb-b {
top: 112px;
left: 282px;
}
.button-builder .colorpicker-submit {
position: absolute;
width: 22px;
height: 22px;
left: 322px;
top: 142px;
overflow: hidden;
}
.button-builder .colorpicker-submit.colorpicker-focus {
background-position: bottom;
}
.button-builder .colorpicker-focus {
background-position: center;
}
.button-builder .colorpicker-slider {
background-position: bottom;
}
/**=====================
65. Button Builder colorpicker CSS start
==========================**/
/**=====================
64. Button Builder CSS start Here
==========================**/
.button-builder .colorpicker-submit:visited {
background-color: #2c323f;
background-image: none;
color: #fff;
text-decoration: none;
}
.button-builder .button-generator-bx {
position: fixed;
width: 340px;
max-height: 500px;
height: 100%;
overflow-y: auto;
overflow-x: hidden;
}
.button-builder .custom-button-color {
display: none;
}
.button-builder .custom-button-color .form-control {
width: 100px;
border-radius: 5px 0 0 5px;
}
.button-builder .color-slelector {
float: left;
height: 39px;
position: relative;
width: 39px;
}
.button-builder .color-slelector div {
height: 33px;
left: 0;
position: absolute;
top: 0;
width: 33px;
transform: scale(1.4);
z-index: 1;
background: url(../images/button_builder/select.png) repeat scroll 0 0 rgba(0, 0, 0, 0);
}
.button-builder .custom-radio {
width: 16px;
height: 16px;
display: inline-block;
position: relative;
z-index: 1;
top: 3px;
border: 1px solid var(--theme-deafult);
border-radius: 100%;
}
.button-builder .custom-radio:hover {
background-position: 0 -16px;
}
.button-builder .custom-radio.selected {
background-color: var(--theme-deafult);
}
.button-builder .custom-radio input[type=radio] {
margin: 1px;
position: absolute;
z-index: 2;
cursor: pointer;
outline: none;
opacity: 0;
filter: alpha(opacity=0);
}
.button-builder .custom-checkbox {
width: 16px;
height: 16px;
display: inline-block;
position: relative;
z-index: 1;
top: 3px;
background: url(../images/button_builder/checkbox-sprite.png) no-repeat 0 0 transparent;
}
.button-builder .custom-checkbox:hover {
background-position: 0 -16px;
}
.button-builder .custom-checkbox.selected {
background-position: 0 -32px;
}
.button-builder .custom-checkbox input[type=checkbox] {
margin: 0;
position: absolute;
z-index: 2;
cursor: pointer;
outline: none;
opacity: 0;
filter: alpha(opacity=0);
}
.button-builder .colorpicker-hex {
background: url(../images/button_builder/hex_bg.gif) no-repeat scroll right center rgba(0, 0, 0, 0);
left: 220px;
padding-left: 15px;
position: absolute;
top: 98px;
width: 75px;
height: 25px;
box-sizing: content-box;
}
.button-builder .colorpicker-hex input {
background: transparent;
border: medium none;
color: #242934;
display: block;
box-shadow: none;
font-size: 13px;
height: 17px;
outline: medium none;
padding: 5px;
top: 0;
right: 1px;
text-align: left;
text-transform: uppercase;
width: 65px;
box-sizing: content-box;
}
.button-builder .colorpicker-hue {
background: url(../images/button_builder/rainbow.png) no-repeat scroll center center rgba(0, 0, 0, 0);
cursor: default;
height: 150px;
left: 171px;
position: absolute;
top: 13px;
width: 35px;
}
.button-builder .colorpicker-hue div {
background: url(../images/button_builder/scroll.png) no-repeat scroll left top rgba(0, 0, 0, 0);
height: 16px;
left: 0;
margin-top: -8px;
overflow: hidden;
position: absolute;
width: 35px;
}
.button-builder .colorpicker-new-color {
height: 75px;
left: 235px;
position: absolute;
top: 12px;
width: 73px;
border: 1px solid #ecf3fa;
}
.button-builder .colorpicker-field {
display: none;
}
.button-builder .colorpicker-current-color {
display: none;
}
.button-builder .colorpicker-submit {
cursor: pointer;
display: block;
height: 25px;
left: 235px;
position: absolute;
top: 133px;
width: 75px;
background-color: var(--theme-deafult);
border-radius: 5px;
}
.button-builder .colorpicker-submit:before {
content: "Ok";
position: absolute;
width: 100%;
text-align: center;
padding: 3px 10px;
color: #fff;
}
.button-builder .colorpicker-submit:hover {
background-color: #4433ff;
}
.button-builder .box {
background-color: #fff;
margin-bottom: 20px;
padding: 30px;
text-align: center;
border: 1px solid #efefef;
border-radius: 5px;
}
.button-builder .button-preview {
min-height: 145px;
}
.button-builder .button-preview h2 {
color: #2c323f;
font-size: 18px;
font-weight: normal;
margin: 0;
}
.button-builder .button-preview.affix {
top: 58px;
position: fixed;
width: 395px;
z-index: 999;
}
.button-builder #result {
padding-top: 30px;
}
.button-builder .well .language-markup {
word-wrap: break-word;
white-space: normal;
}
.button-builder .well .language-css {
word-wrap: break-word;
white-space: pre-wrap;
}
.button-builder pre.well {
margin: 0;
padding: 0;
background: #fff !important;
overflow: unset;
}
.button-builder .copy {
margin-top: 30px;
position: relative;
}
.button-builder .copy .zclip {
left: 0 !important;
right: 0 !important;
margin: 0 auto !important;
}
.button-builder .copy a {
background-color: var(--theme-deafult);
color: #fff;
font-weight: bold;
display: inline-block;
padding: 0.375rem 1.75rem;
border-radius: 5px;
}
.button-builder .sucess-msg {
height: 30px;
line-height: 30px;
display: none;
font-size: 14px;
width: 100%;
text-align: center;
margin-bottom: -30px;
}
.button-builder .code-wrapper {
position: relative;
width: 100%;
margin: 0;
}
.button-builder .column-left {
float: left;
width: 655px;
}
.button-builder .column-right {
float: right;
width: 395px;
position: relative;
padding-top: 175px;
}
.button-builder code {
font-size: 11.5px !important;
}
.button-builder .hint-label {
float: left;
padding: 4px 0 0 20px;
font-style: italic;
}
.button-builder .button-style {
margin-top: 1px !important;
}
.button-builder .ad-box {
height: 90px;
overflow: hidden;
margin: 0 0 20px;
}
.button-builder ul.the-icons {
margin: 0 0 0 -8px;
padding-left: 0;
font-size: 13px;
}
.button-builder ul.the-icons li {
float: left;
line-height: 15px;
cursor: pointer;
text-align: center;
list-style: none outside none;
padding: 5px;
border: 1px dotted #efefef;
color: #898989;
width: 40px;
transition: all 0.2s ease-in-out 0s;
margin: 2px;
}
.button-builder ul.the-icons li em {
display: none !important;
}
.button-builder ul.the-icons li:hover {
background: #fff;
box-shadow: 0 0 3px #f4f4f4;
}
.button-builder ul.the-icons li:hover.active {
background: #fff;
box-shadow: 0 0 3px #f4f4f4;
}
.button-builder-wrap .form-group {
margin-bottom: 15px;
}
.button-builder-wrap .form-group .btn {
margin-right: 15px;
margin-bottom: 15px;
min-width: 100px;
}
.button-builder-wrap .grp-btns .btn input {
display: none;
}
/*==============================
64. Button Builder CSS End
===========================*/
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+182
View File
@@ -0,0 +1,182 @@
button, hr, input {
overflow: visible;
}
audio, canvas, progress, video {
display: inline-block;
}
progress, sub, sup {
vertical-align: baseline;
}
html {
font-family: sans-serif;
line-height: 1.15;
-ms-text-size-adjust: 100%;
-webkit-text-size-adjust: 100%;
}
body {
margin: 0;
}
menu, article, aside, details, footer, header, nav, section {
display: block;
}
h1 {
font-size: 2em;
margin: 0.67em 0;
}
figcaption, figure, main {
display: block;
}
figure {
margin: 1em 40px;
}
hr {
box-sizing: content-box;
height: 0;
}
code, kbd, pre, samp {
font-family: monospace, monospace;
font-size: 1em;
}
a {
background-color: transparent;
-webkit-text-decoration-skip: objects;
}
a:active, a:hover {
outline-width: 0;
}
abbr[title] {
border-bottom: none;
text-decoration: underline;
text-decoration: underline dotted;
}
b, strong {
font-weight: bolder;
}
dfn {
font-style: italic;
}
mark {
background-color: #ff0;
color: #000;
}
small {
font-size: 80%;
}
sub, sup {
font-size: 75%;
line-height: 0;
position: relative;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
audio:not([controls]) {
display: none;
height: 0;
}
img {
border-style: none;
}
svg:not(:root) {
overflow: hidden;
}
button, input, optgroup, select, textarea {
font-family: sans-serif;
font-size: 100%;
line-height: 1.15;
margin: 0;
}
button, select {
text-transform: none;
}
[type=submit], [type=reset], button, html [type=button] {
-webkit-appearance: button;
}
[type=button]::-moz-focus-inner, [type=reset]::-moz-focus-inner, [type=submit]::-moz-focus-inner, button::-moz-focus-inner {
border-style: none;
padding: 0;
}
[type=button]:-moz-focusring, [type=reset]:-moz-focusring, [type=submit]:-moz-focusring, button:-moz-focusring {
outline: ButtonText dotted 1px;
}
fieldset {
border: 1px solid silver;
margin: 0 2px;
padding: 0.35em 0.625em 0.75em;
}
legend {
box-sizing: border-box;
color: inherit;
display: table;
max-width: 100%;
padding: 0;
white-space: normal;
}
textarea {
overflow: auto;
}
[type=checkbox], [type=radio] {
box-sizing: border-box;
padding: 0;
}
[type=number]::-webkit-inner-spin-button, [type=number]::-webkit-outer-spin-button {
height: auto;
}
[type=search] {
-webkit-appearance: textfield;
outline-offset: -2px;
}
[type=search]::-webkit-search-cancel-button, [type=search]::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-file-upload-button {
-webkit-appearance: button;
font: inherit;
}
summary {
display: list-item;
}
[hidden], template {
display: none;
}
+1
View File
@@ -0,0 +1 @@
{"version":3,"sources":["vendors/feather-icon/_feather-icon.scss"],"names":[],"mappings":"AAAA,gBACE,gBAAiB,CAClB,4BAGC,oBAAqB,CACtB,iBAGC,uBAAwB,CACzB,KAGC,sBAAuB,CACvB,gBAAiB,CACjB,yBAA0B,CAC1B,6BAA8B,CAC/B,KAGC,QAAS,CACV,qDAGC,aAAc,CACf,GAGC,aAAc,CACd,cAAe,CAChB,uBAGC,aAAc,CACf,OAGC,eAAgB,CACjB,GAGC,8BAAuB,CAAvB,sBAAuB,CACvB,QAAS,CACV,kBAGC,+BAAgC,CAChC,aAAc,CACf,EAGC,4BAA6B,CAC7B,oCAAqC,CACtC,iBAGC,eAAgB,CACjB,YAGC,kBAAmB,CACnB,yBAA0B,CAC1B,wCAAiB,CAAjB,gCAAiC,CAClC,SAGC,kBAAmB,CACpB,IAGC,iBAAkB,CACnB,KAGC,qBAAsB,CACtB,UAAW,CACZ,MAGC,aAAc,CACf,QAGC,aAAc,CACd,aAAc,CACd,iBAAkB,CACnB,IAGC,aAAc,CACf,IAGC,SAAU,CACX,sBAGC,YAAa,CACb,QAAS,CACV,IAGC,iBAAkB,CACnB,eAGC,eAAgB,CACjB,sCAGC,sBAAuB,CACvB,cAAe,CACf,gBAAiB,CACjB,QAAS,CACV,cAMC,mBAAoB,CACrB,qDAGC,yBAA0B,CAC3B,wHAGC,iBAAkB,CAClB,SAAU,CACX,4GAGC,6BAA8B,CAC/B,SAGC,uBAAwB,CACxB,YAAa,CACb,0BAA2B,CAC5B,OAGC,6BAAsB,CAAtB,qBAAsB,CACtB,aAAc,CACd,aAAc,CACd,cAAe,CACf,SAAU,CACV,kBAAmB,CACpB,SAMC,aAAc,CACf,6BAGC,6BAAsB,CAAtB,qBAAsB,CACtB,SAAU,CACX,kFAGC,WAAY,CACb,cAGC,4BAA6B,CAC7B,mBAAoB,CACrB,qFAGC,uBAAwB,CACzB,6BAGC,yBAA0B,CAC1B,YAAa,CACd,QAGC,iBAAkB,CACnB,kBAGC,YAAa","file":"vendors/feather-icon.css","sourcesContent":["button,hr,input {\r\n overflow: visible;\r\n}\r\n\r\naudio,canvas,progress,video {\r\n display: inline-block;\r\n}\r\n\r\nprogress,sub,sup {\r\n vertical-align: baseline;\r\n}\r\n\r\nhtml {\r\n font-family: sans-serif;\r\n line-height: 1.15;\r\n -ms-text-size-adjust: 100%;\r\n -webkit-text-size-adjust: 100%;\r\n}\r\n\r\nbody {\r\n margin: 0;\r\n}\r\n\r\nmenu,article,aside,details,footer,header,nav,section {\r\n display: block;\r\n}\r\n\r\nh1 {\r\n font-size: 2em;\r\n margin: .67em 0;\r\n}\r\n\r\nfigcaption,figure,main {\r\n display: block;\r\n}\r\n\r\nfigure {\r\n margin: 1em 40px;\r\n}\r\n\r\nhr {\r\n box-sizing: content-box;\r\n height: 0;\r\n}\r\n\r\ncode,kbd,pre,samp {\r\n font-family: monospace,monospace;\r\n font-size: 1em;\r\n}\r\n\r\na {\r\n background-color: transparent;\r\n -webkit-text-decoration-skip: objects;\r\n}\r\n\r\na:active,a:hover {\r\n outline-width: 0;\r\n}\r\n\r\nabbr[title] {\r\n border-bottom: none;\r\n text-decoration: underline;\r\n text-decoration: underline dotted;\r\n}\r\n\r\nb,strong {\r\n font-weight: bolder;\r\n}\r\n\r\ndfn {\r\n font-style: italic;\r\n}\r\n\r\nmark {\r\n background-color: #ff0;\r\n color: #000;\r\n}\r\n\r\nsmall {\r\n font-size: 80%;\r\n}\r\n\r\nsub,sup {\r\n font-size: 75%;\r\n line-height: 0;\r\n position: relative;\r\n}\r\n\r\nsub {\r\n bottom: -.25em;\r\n}\r\n\r\nsup {\r\n top: -.5em;\r\n}\r\n\r\naudio:not([controls]) {\r\n display: none;\r\n height: 0;\r\n}\r\n\r\nimg {\r\n border-style: none;\r\n}\r\n\r\nsvg:not(:root) {\r\n overflow: hidden;\r\n}\r\n\r\nbutton,input,optgroup,select,textarea {\r\n font-family: sans-serif;\r\n font-size: 100%;\r\n line-height: 1.15;\r\n margin: 0;\r\n}\r\n\r\nbutton,input {\r\n}\r\n\r\nbutton,select {\r\n text-transform: none;\r\n}\r\n\r\n[type=submit], [type=reset],button,html [type=button] {\r\n -webkit-appearance: button;\r\n}\r\n\r\n[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner {\r\n border-style: none;\r\n padding: 0;\r\n}\r\n\r\n[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring {\r\n outline: ButtonText dotted 1px;\r\n}\r\n\r\nfieldset {\r\n border: 1px solid silver;\r\n margin: 0 2px;\r\n padding: .35em .625em .75em;\r\n}\r\n\r\nlegend {\r\n box-sizing: border-box;\r\n color: inherit;\r\n display: table;\r\n max-width: 100%;\r\n padding: 0;\r\n white-space: normal;\r\n}\r\n\r\nprogress {\r\n}\r\n\r\ntextarea {\r\n overflow: auto;\r\n}\r\n\r\n[type=checkbox],[type=radio] {\r\n box-sizing: border-box;\r\n padding: 0;\r\n}\r\n\r\n[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button {\r\n height: auto;\r\n}\r\n\r\n[type=search] {\r\n -webkit-appearance: textfield;\r\n outline-offset: -2px;\r\n}\r\n\r\n[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration {\r\n -webkit-appearance: none;\r\n}\r\n\r\n::-webkit-file-upload-button {\r\n -webkit-appearance: button;\r\n font: inherit;\r\n}\r\n\r\nsummary {\r\n display: list-item;\r\n}\r\n\r\n[hidden],template {\r\n display: none;\r\n}"]}
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
+445
View File
@@ -0,0 +1,445 @@
@charset "UTF-8";
.jsgrid {
position: relative;
overflow: hidden;
font-size: 1em;
box-sizing: border-box;
}
.jsgrid * {
box-sizing: border-box;
}
.jsgrid :after {
box-sizing: border-box;
}
.jsgrid :before {
box-sizing: border-box;
}
.jsgrid input {
font-size: 1em;
}
.jsgrid select {
font-size: 1em;
}
.jsgrid textarea {
font-size: 1em;
}
.jsgrid-grid-header {
overflow-x: hidden;
overflow-y: scroll;
user-select: none;
}
.jsgrid-grid-body {
overflow-x: auto;
overflow-y: scroll;
}
.jsgrid-table {
width: 100%;
table-layout: fixed;
border-collapse: collapse;
border-spacing: 0;
}
.jsgrid-cell {
padding: 0.5em;
}
.jsgrid-header-cell {
box-sizing: border-box;
padding: 0.5em;
}
.jsgrid-сell {
box-sizing: border-box;
}
.jsgrid-align-left {
text-align: left;
}
.jsgrid-align-center {
text-align: center;
}
.jsgrid-align-center input {
text-align: center;
}
.jsgrid-align-center select {
text-align: center;
}
.jsgrid-align-center textarea {
text-align: center;
}
.jsgrid-align-right {
text-align: right;
}
.jsgrid-align-right input {
text-align: right;
}
.jsgrid-align-right select {
text-align: right;
}
.jsgrid-align-right textarea {
text-align: right;
}
.jsgrid-edit-row input {
width: 100%;
padding: 0.3em 0.5em;
}
.jsgrid-edit-row select {
width: 100%;
padding: 0.3em 0.5em;
}
.jsgrid-edit-row textarea {
width: 100%;
padding: 0.3em 0.5em;
}
.jsgrid-edit-row input[type=checkbox] {
width: auto;
}
.jsgrid-filter-row input {
width: 100%;
padding: 0.3em 0.5em;
}
.jsgrid-filter-row select {
width: 100%;
padding: 0.3em 0.5em;
}
.jsgrid-filter-row textarea {
width: 100%;
padding: 0.3em 0.5em;
}
.jsgrid-filter-row input[type=checkbox] {
width: auto;
}
.jsgrid-insert-row input {
width: 100%;
padding: 0.3em 0.5em;
}
.jsgrid-insert-row select {
width: 100%;
padding: 0.3em 0.5em;
}
.jsgrid-insert-row textarea {
width: 100%;
padding: 0.3em 0.5em;
}
.jsgrid-insert-row input[type=checkbox] {
width: auto;
}
.jsgrid-header-sort {
cursor: pointer;
}
.jsgrid-pager {
padding: 0.5em 0;
}
.jsgrid-pager-nav-button {
padding: 0.2em 0.6em;
}
.jsgrid-pager-nav-inactive-button {
display: none;
pointer-events: none;
}
.jsgrid-pager-page {
padding: 0.2em 0.6em;
}
.jsgrid-selected-row .jsgrid-cell {
cursor: pointer;
}
.jsgrid-nodata-row .jsgrid-cell {
padding: 0.5em 0;
text-align: center;
}
.jsgrid-grid-body {
border: 1px solid #e9e9e9;
border-top: none;
}
.jsgrid-grid-body .jsgrid-cell:first-child {
border-left: none;
}
.jsgrid-grid-body .jsgrid-cell:last-child {
border-right: none;
}
.jsgrid-grid-body .jsgrid-alt-row:first-child .jsgrid-cell {
border-top: none;
}
.jsgrid-grid-body .jsgrid-row:first-child .jsgrid-cell {
border-top: none;
}
.jsgrid-grid-header {
border: 1px solid #e9e9e9;
background: #f9f9f9;
}
.jsgrid-header-row .jsgrid-align-left {
text-align: center;
}
.jsgrid-header-row .jsgrid-align-right {
text-align: center;
}
.jsgrid-header-row .jsgrid-header-sort {
background: #c4e2ff;
}
.jsgrid-header-row > .jsgrid-header-cell {
border: 1px solid #e9e9e9;
border-top: 0;
background: #f9f9f9;
border-bottom: 0;
}
.jsgrid-header-row > .jsgrid-header-cell:first-child {
border-left: none;
}
.jsgrid-header-row > .jsgrid-header-cell:last-child {
border-right: none;
}
.jsgrid-header-scrollbar {
scrollbar-arrow-color: #f1f1f1;
scrollbar-base-color: #f1f1f1;
scrollbar-3dlight-color: #f1f1f1;
scrollbar-highlight-color: #f1f1f1;
scrollbar-track-color: #f1f1f1;
scrollbar-shadow-color: #f1f1f1;
scrollbar-dark-shadow-color: #f1f1f1;
}
.jsgrid-header-scrollbar::-webkit-scrollbar {
visibility: hidden;
}
.jsgrid-header-scrollbar::-webkit-scrollbar-track {
background: #f1f1f1;
}
.jsgrid-cell {
border: 1px solid #f3f3f3;
}
.jsgrid-invalid input {
background: #ffe3e5;
border: 1px solid #ff808a;
}
.jsgrid-invalid select {
background: #ffe3e5;
border: 1px solid #ff808a;
}
.jsgrid-invalid textarea {
background: #ffe3e5;
border: 1px solid #ff808a;
}
.jsgrid-pager-current-page {
font-weight: 700;
}
.jsgrid-button:hover {
opacity: 0.5;
transition: opacity 200ms linear;
}
.jsgrid-button + .jsgrid-button {
margin-left: 5px;
}
.jsgrid .jsgrid-button {
width: 16px;
height: 16px;
border: none;
cursor: pointer;
background-image: url(../../images/js-grid.png);
background-repeat: no-repeat;
background-color: transparent;
}
.jsgrid .jsgrid-mode-button {
width: 24px;
height: 24px;
}
@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2) {
.jsgrid .jsgrid-button {
background-image: url(../../images/js-grid.png);
background-size: 24px 352px;
}
}
.jsgrid-mode-on-button {
opacity: 0.5;
}
.jsgrid-cancel-edit-button {
background-position: 0 0;
width: 16px;
height: 16px;
}
.jsgrid-clear-filter-button {
background-position: 0 -40px;
width: 16px;
height: 16px;
}
.jsgrid-delete-button {
background-position: 0 -80px;
width: 16px;
height: 16px;
}
.jsgrid-edit-button {
background-position: 0 -120px;
width: 16px;
height: 16px;
}
.jsgrid-insert-mode-button {
background-position: 0 -160px;
width: 24px;
height: 24px;
}
.jsgrid-insert-button {
background-position: 0 -208px;
width: 16px;
height: 16px;
}
.jsgrid-search-mode-button {
background-position: 0 -248px;
width: 24px;
height: 24px;
}
.jsgrid-search-button {
background-position: 0 -296px;
width: 16px;
height: 16px;
}
.jsgrid-update-button {
background-position: 0 -336px;
width: 16px;
height: 16px;
}
.jsgrid-load-shader {
background: #ddd;
opacity: 0.5;
filter: alpha(opacity=50);
}
.jsgrid-load-panel {
width: 15em;
height: 5em;
background: #fff;
border: 1px solid #e9e9e9;
padding-top: 3em;
text-align: center;
}
.jsgrid-load-panel:before {
content: " ";
position: absolute;
top: 0.5em;
left: 50%;
margin-left: -1em;
width: 2em;
height: 2em;
border: 2px solid #009a67;
border-right-color: transparent;
border-radius: 50%;
animation: indicator 1s linear infinite;
}
@-webkit-keyframes indicator {}
@keyframes indicator {
from {
transform: rotate(0deg);
}
50% {
transform: rotate(180deg);
}
to {
transform: rotate(360deg);
}
}
.jsgrid-edit-row > .jsgrid-cell {
border: 1px solid #e9e9e9;
background: #fdffe3;
}
.jsgrid-filter-row > .jsgrid-cell {
border: 1px solid #e9e9e9;
border-bottom: 0;
background: #f9f9f9;
}
.jsgrid-filter-row > .jsgrid-cell:first-child {
border-left: none;
}
.jsgrid-filter-row > .jsgrid-cell:last-child {
border-right: none;
}
.jsgrid-insert-row > .jsgrid-cell {
border: 1px solid #e9e9e9;
border-bottom: 0;
background: #e3ffe5;
}
.jsgrid-insert-row > .jsgrid-cell:first-child {
border-left: none;
}
.jsgrid-insert-row > .jsgrid-cell:last-child {
border-right: none;
}
.jsgrid-header-sortable:hover {
cursor: pointer;
background: #f9f9f9;
}
.jsgrid-header-sort:before {
content: " ";
display: block;
float: right;
width: 0;
height: 0;
border-style: solid;
margin-top: 8px;
margin-right: 9px;
}
.jsgrid-header-sort-asc:before {
border-width: 0 5px 5px;
border-color: transparent transparent #ffc412;
}
.jsgrid-header-sort-desc:before {
border-width: 5px 5px 0;
border-color: #ffc412 transparent transparent;
}
.jsgrid-row > .jsgrid-cell {
background: #fff;
}
.jsgrid-alt-row > .jsgrid-cell {
background: #f9f9f9;
}
.jsgrid-selected-row > .jsgrid-cell {
background: #c4e2ff;
border-color: #c4e2ff;
}
.jsgrid-pager-nav-inactive-button a {
color: #d3d3d3;
}
File diff suppressed because one or more lines are too long
+125
View File
@@ -0,0 +1,125 @@
/*=============Scrollable css start=============*/
.ps-container.ps-active-y > .ps-scrollbar-y-rail, .ps-container.ps-active-x > .ps-scrollbar-x-rail {
background-color: transparent;
display: block;
}
.scroll-demo {
padding: 10px;
position: relative;
border: 1px solid #f4f4f4;
overflow: auto;
height: 300px;
}
.scroll-demo .horz-scroll-content {
width: 1600px;
}
.ps-container {
touch-action: none;
overflow: hidden !important;
}
.ps-container.ps-in-scrolling {
pointer-events: none;
}
.ps-container.ps-in-scrolling.ps-x > .ps-scrollbar-x-rail {
background-color: #f4f4f4;
opacity: 0.9;
}
.ps-container.ps-in-scrolling.ps-x > .ps-scrollbar-x-rail > .ps-scrollbar-x {
background-color: #59667a;
}
.ps-container.ps-in-scrolling.ps-y > .ps-scrollbar-y-rail {
background-color: #f4f4f4;
opacity: 0.9;
}
.ps-container.ps-in-scrolling.ps-y > .ps-scrollbar-y-rail > .ps-scrollbar-y {
background-color: #59667a;
}
.ps-container > .ps-scrollbar-x-rail {
display: none;
position: absolute;
border-radius: 4px;
opacity: 0;
transition: background-color 0.2s linear, opacity 0.2s linear;
bottom: 3px;
height: 8px;
}
.ps-container > .ps-scrollbar-x-rail > .ps-scrollbar-x {
position: absolute;
background-color: #59667a;
border-radius: 4px;
transition: background-color 0.2s linear;
bottom: 0;
height: 8px;
}
.ps-container > .ps-scrollbar-y-rail {
right: 3px;
width: 8px;
display: none;
position: absolute;
border-radius: 4px;
opacity: 0;
transition: background-color 0.2s linear, opacity 0.2s linear;
}
.ps-container > .ps-scrollbar-y-rail > .ps-scrollbar-y {
width: 10px;
position: absolute;
background-color: #59667a;
border-radius: 4px;
transition: background-color 0.2s linear;
right: 0;
}
.ps-container:hover.ps-in-scrolling {
pointer-events: none;
}
.ps-container:hover.ps-in-scrolling.ps-x > .ps-scrollbar-x-rail {
background-color: #59667a;
opacity: 0.9;
}
.ps-container:hover.ps-in-scrolling.ps-x > .ps-scrollbar-x-rail > .ps-scrollbar-x {
width: 128px;
background-color: #999999;
}
.ps-container:hover.ps-in-scrolling.ps-y > .ps-scrollbar-y-rail {
background-color: #59667a;
opacity: 0.9;
}
.ps-container:hover.ps-in-scrolling.ps-y > .ps-scrollbar-y-rail > .ps-scrollbar-y {
background-color: #999999;
}
.ps-container:hover > .ps-scrollbar-x-rail {
opacity: 0.6;
}
.ps-container:hover > .ps-scrollbar-x-rail:hover {
background-color: #f4f4f4;
opacity: 0.9;
}
.ps-container:hover > .ps-scrollbar-x-rail:hover > .ps-scrollbar-x {
background-color: #999999;
}
.ps-container:hover > .ps-scrollbar-y-rail {
opacity: 0.6;
}
.ps-container:hover > .ps-scrollbar-y-rail:hover {
background-color: #f4f4f4;
opacity: 0.9;
}
.ps-container:hover > .ps-scrollbar-y-rail:hover > .ps-scrollbar-y {
background-color: #59667a;
}
.always-visible.ps-container > .ps-scrollbar-x-rail {
opacity: 0.6;
}
.always-visible.ps-container > .ps-scrollbar-y-rail {
opacity: 0.6;
}
.large-margin.ps-container > .ps-scrollbar-x-rail {
margin: 0 25%;
}
.large-margin.ps-container > .ps-scrollbar-y-rail {
margin: 100px 0;
}
/*=============Scrollable css end=============*/
File diff suppressed because one or more lines are too long
+212
View File
@@ -0,0 +1,212 @@
[data-simplebar] {
position: relative;
flex-direction: column;
flex-wrap: wrap;
justify-content: flex-start;
align-content: flex-start;
align-items: flex-start;
}
.simplebar-wrapper {
overflow: hidden;
width: inherit;
height: inherit;
max-width: inherit;
max-height: inherit;
}
.simplebar-mask {
direction: inherit;
position: absolute;
overflow: hidden;
padding: 0;
margin: 0;
left: 0;
top: 0;
bottom: 0;
right: 0;
width: auto !important;
height: auto !important;
z-index: 0;
}
.simplebar-offset {
direction: inherit !important;
box-sizing: inherit !important;
resize: none !important;
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
padding: 0;
margin: 0;
-webkit-overflow-scrolling: touch;
}
.simplebar-content-wrapper {
direction: inherit;
box-sizing: border-box !important;
position: relative;
display: block;
height: 100%; /* Required for horizontal native scrollbar to not appear if parent is taller than natural height */
width: auto;
max-width: 100%; /* Not required for horizontal scroll to trigger */
max-height: 100%; /* Needed for vertical scroll to trigger */
scrollbar-width: none;
-ms-overflow-style: none;
padding-bottom: 30px;
}
.simplebar-content-wrapper::-webkit-scrollbar,
.simplebar-hide-scrollbar::-webkit-scrollbar {
width: 0;
height: 0;
}
.simplebar-content:before,
.simplebar-content:after {
content: " ";
display: table;
}
.simplebar-placeholder {
max-height: 100%;
max-width: 100%;
width: 100%;
pointer-events: none;
}
.simplebar-height-auto-observer-wrapper {
box-sizing: inherit !important;
height: 100%;
width: 100%;
max-width: 1px;
position: relative;
float: left;
max-height: 1px;
overflow: hidden;
z-index: -1;
padding: 0;
margin: 0;
pointer-events: none;
flex-grow: inherit;
flex-shrink: 0;
flex-basis: 0;
}
.simplebar-height-auto-observer {
box-sizing: inherit;
display: block;
opacity: 0;
position: absolute;
top: 0;
left: 0;
height: 1000%;
width: 1000%;
min-height: 1px;
min-width: 1px;
overflow: hidden;
pointer-events: none;
z-index: -1;
}
.simplebar-track {
z-index: 1;
position: absolute;
right: 0;
bottom: 0;
pointer-events: none;
overflow: hidden;
}
[data-simplebar].simplebar-dragging .simplebar-content {
pointer-events: none;
user-select: none;
-webkit-user-select: none;
}
[data-simplebar].simplebar-dragging .simplebar-track {
pointer-events: all;
}
.simplebar-scrollbar {
position: absolute;
left: 0;
right: 0;
min-height: 10px;
}
.simplebar-scrollbar:before {
position: absolute;
content: "";
background: black;
border-radius: 7px;
left: 2px;
right: 2px;
opacity: 0;
transition: opacity 0.2s linear;
}
.simplebar-scrollbar.simplebar-visible:before {
/* When hovered, remove all transitions from drag handle */
opacity: 0.5;
transition: opacity 0s linear;
}
.simplebar-track.simplebar-vertical {
top: 0;
width: 11px;
}
.simplebar-track.simplebar-vertical .simplebar-scrollbar:before {
top: 2px;
bottom: 2px;
}
.simplebar-track.simplebar-horizontal {
left: 0;
height: 11px;
}
.simplebar-track.simplebar-horizontal .simplebar-scrollbar:before {
height: 100%;
left: 2px;
right: 2px;
}
.simplebar-track.simplebar-horizontal .simplebar-scrollbar {
right: auto;
left: 0;
top: 2px;
height: 7px;
min-height: 0;
min-width: 10px;
width: auto;
}
/* Rtl support */
[data-simplebar-direction=rtl] .simplebar-track.simplebar-vertical {
right: auto;
left: 0;
}
.hs-dummy-scrollbar-size {
direction: rtl;
position: fixed;
opacity: 0;
visibility: hidden;
height: 500px;
width: 500px;
overflow-y: hidden;
overflow-x: scroll;
}
.simplebar-hide-scrollbar {
position: fixed;
left: 0;
visibility: hidden;
overflow-y: scroll;
scrollbar-width: none;
-ms-overflow-style: none;
}
File diff suppressed because one or more lines are too long
+704
View File
@@ -0,0 +1,704 @@
@charset "UTF-8";
.CodeMirror {
color: #000;
position: relative;
overflow: hidden;
background: #fff;
height: auto;
min-height: 300px;
border: 1px solid #ddd;
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
padding: 10px;
font: inherit;
z-index: 1;
}
.CodeMirror pre {
padding: 0 4px;
border-radius: 0;
border-width: 0;
background: 0 0;
font-family: inherit;
font-size: inherit;
margin: 0;
white-space: pre;
word-wrap: normal;
line-height: inherit;
color: inherit;
z-index: 2;
position: relative;
overflow: visible;
font-variant-ligatures: none;
}
.CodeMirror .CodeMirror-code .cm-tag {
color: #63a35c;
}
.CodeMirror .CodeMirror-code .cm-attribute {
color: #795da3;
}
.CodeMirror .CodeMirror-code .cm-string {
color: #183691;
}
.CodeMirror .CodeMirror-code .cm-header-1 {
font-size: 200%;
line-height: 200%;
}
.CodeMirror .CodeMirror-code .cm-header-2 {
font-size: 160%;
line-height: 160%;
}
.CodeMirror .CodeMirror-code .cm-header-3 {
font-size: 125%;
line-height: 125%;
}
.CodeMirror .CodeMirror-code .cm-header-4 {
font-size: 110%;
line-height: 110%;
}
.CodeMirror .CodeMirror-code .cm-comment {
background: rgba(0, 0, 0, 0.05);
border-radius: 2px;
}
.CodeMirror .CodeMirror-code .cm-link {
color: #7f8c8d;
}
.CodeMirror .CodeMirror-code .cm-url {
color: #aab2b3;
}
.CodeMirror .CodeMirror-code .cm-strikethrough {
text-decoration: line-through;
}
.CodeMirror .CodeMirror-selected {
background: #ddd;
}
.CodeMirror .CodeMirror-placeholder {
opacity: 0.5;
}
.CodeMirror div.CodeMirror-secondarycursor {
border-left: 1px solid silver;
}
.CodeMirror .cm-spell-error:not(.cm-url):not(.cm-comment):not(.cm-tag):not(.cm-word) {
background: rgba(255, 0, 0, 0.15);
}
.CodeMirror-lines {
padding: 4px 0;
cursor: text;
min-height: 1px;
}
.CodeMirror-gutter-filler {
background-color: #fff;
position: absolute;
z-index: 6;
display: none;
left: 0;
bottom: 0;
}
.CodeMirror-scrollbar-filler {
background-color: #fff;
position: absolute;
z-index: 6;
display: none;
right: 0;
bottom: 0;
}
.CodeMirror-gutters {
border-right: 1px solid #ddd;
background-color: #f7f7f7;
white-space: nowrap;
position: absolute;
left: 0;
top: 0;
min-height: 100%;
z-index: 3;
box-sizing: content-box;
}
.CodeMirror-linenumber {
padding: 0 3px 0 5px;
min-width: 20px;
text-align: right;
color: #999;
white-space: nowrap;
box-sizing: content-box;
}
.CodeMirror-guttermarker {
color: #000;
}
.CodeMirror-guttermarker-subtle {
color: #999;
}
.CodeMirror-cursor {
border-left: 1px solid #000;
border-right: none;
width: 0;
position: absolute;
}
.cm-fat-cursor .CodeMirror-cursor {
width: auto;
border: 0 !important;
background: #7e7;
}
.cm-fat-cursor div.CodeMirror-cursors {
z-index: 1;
}
.cm-animate-fat-cursor {
width: auto;
border: 0;
animation: blink 1.06s steps(1) infinite;
background-color: #7e7;
}
@-moz-keyframes blink {
50% {
background-color: transparent;
}
}
@-webkit-keyframes blink {
50% {
background-color: transparent;
}
}
@keyframes blink {
50% {
background-color: transparent;
}
}
.cm-tab {
display: inline-block;
text-decoration: inherit;
}
.CodeMirror-ruler {
border-left: 1px solid #ccc;
position: absolute;
}
.cm-s-default .cm-header {
color: #00f;
}
.cm-s-default .cm-quote {
color: #090;
}
.cm-s-default .cm-keyword {
color: #708;
}
.cm-s-default .cm-atom {
color: #219;
}
.cm-s-default .cm-number {
color: #164;
}
.cm-s-default .cm-def {
color: #00f;
}
.cm-s-default .cm-variable-2 {
color: #05a;
}
.cm-s-default .cm-variable-3 {
color: #085;
}
.cm-s-default .cm-comment {
color: #a50;
}
.cm-s-default .cm-string {
color: #a11;
}
.cm-s-default .cm-string-2 {
color: #f50;
}
.cm-s-default .cm-meta {
color: #555;
}
.cm-s-default .cm-qualifier {
color: #555;
}
.cm-s-default .cm-builtin {
color: #219;
}
.cm-s-default .cm-bracket {
color: #997;
}
.cm-s-default .cm-tag {
color: #090;
}
.cm-s-default .cm-attribute {
color: #00c;
}
.cm-s-default .cm-hr {
color: #999;
}
.cm-s-default .cm-link {
color: #00c;
}
.cm-s-default .cm-error {
color: red;
}
.cm-negative {
color: #d44;
}
.cm-positive {
color: #292;
}
.cm-header {
font-weight: 700;
}
.cm-strong {
font-weight: 700;
}
.cm-em {
font-style: italic;
}
.cm-link {
text-decoration: underline;
}
.cm-strikethrough {
text-decoration: line-through;
}
.cm-invalidchar {
color: red;
}
.CodeMirror-composing {
border-bottom: 2px solid;
}
div.CodeMirror-cursors {
visibility: hidden;
position: relative;
z-index: 3;
}
div.CodeMirror-dragcursors {
visibility: visible;
}
div.CodeMirror span.CodeMirror-matchingbracket {
color: #0f0;
}
div.CodeMirror span.CodeMirror-nonmatchingbracket {
color: #f22;
}
.CodeMirror-matchingtag {
background: rgba(255, 150, 0, 0.3);
}
.CodeMirror-activeline-background {
background: #e8f2ff;
}
.CodeMirror-scroll {
overflow: scroll !important;
margin-bottom: -30px;
margin-right: -30px;
padding-bottom: 30px;
height: 100%;
outline: 0;
position: relative;
min-height: 300px;
box-sizing: content-box;
}
.CodeMirror-sizer {
position: relative;
border-right: 30px solid transparent;
box-sizing: content-box;
}
.CodeMirror-hscrollbar {
position: absolute;
z-index: 6;
display: none;
bottom: 0;
left: 0;
overflow-y: hidden;
overflow-x: scroll;
}
.CodeMirror-vscrollbar {
position: absolute;
z-index: 6;
display: none;
right: 0;
top: 0;
overflow-x: hidden;
overflow-y: scroll;
}
.CodeMirror-gutter {
white-space: normal;
height: 100%;
display: inline-block;
vertical-align: top;
margin-bottom: -30px;
box-sizing: content-box;
}
.CodeMirror-gutter-wrapper {
position: absolute;
z-index: 4;
background: 0 0 !important;
border: none !important;
user-select: none;
}
.CodeMirror-gutter-background {
position: absolute;
top: 0;
bottom: 0;
z-index: 4;
}
.CodeMirror-gutter-elt {
position: absolute;
cursor: default;
z-index: 4;
}
.CodeMirror-linebackground {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
z-index: 0;
}
.CodeMirror-linewidget {
position: relative;
z-index: 2;
overflow: auto;
}
.CodeMirror-code {
outline: 0;
}
.CodeMirror-measure {
position: absolute;
width: 100%;
height: 0;
overflow: hidden;
visibility: hidden;
}
.CodeMirror-measure pre {
position: static;
}
.CodeMirror-focused .CodeMirror-selected {
background: #d7d4f0;
}
.CodeMirror-focused div.CodeMirror-cursors {
visibility: visible;
}
.CodeMirror-selected {
background: #ddd;
}
.CodeMirror-line::selection {
background: #d7d4f0;
}
.CodeMirror-line > span::selection {
background: #d7d4f0;
}
.CodeMirror-line > span > span::selection {
background: #d7d4f0;
}
.CodeMirror-line > span > span::-moz-selection {
background: #d7d4f0;
}
.CodeMirror-line > span::-moz-selection {
background: #d7d4f0;
}
.CodeMirror-crosshair {
cursor: crosshair;
}
.CodeMirror-line::-moz-selection {
background: #d7d4f0;
}
.cm-searching {
background: #ffa;
background: rgba(255, 255, 0, 0.4);
}
.cm-force-border {
padding-right: 0.1px;
}
@media print {
.CodeMirror div.CodeMirror-cursors {
visibility: hidden;
}
}
.CodeMirror-fullscreen {
background: #fff;
position: fixed !important;
top: 50px;
left: 0;
right: 0;
bottom: 0;
height: auto;
z-index: 9;
}
.CodeMirror-sided {
width: 50% !important;
}
.editor-toolbar {
position: relative;
opacity: 0.6;
user-select: none;
padding: 0 10px;
border-top: 1px solid #bbb;
border-left: 1px solid #bbb;
border-right: 1px solid #bbb;
border-top-left-radius: 4px;
border-top-right-radius: 4px;
}
.editor-toolbar:after {
display: block;
content: " ";
height: 1px;
margin-top: 8px;
}
.editor-toolbar:before {
display: block;
content: " ";
height: 1px;
margin-bottom: 8px;
}
.editor-toolbar:hover {
opacity: 0.8;
}
.editor-toolbar.fullscreen {
width: 100%;
height: 50px;
overflow-x: auto;
overflow-y: hidden;
white-space: nowrap;
padding-top: 10px;
padding-bottom: 10px;
box-sizing: border-box;
background: #fff;
border: 0;
position: fixed;
top: 0;
left: 0;
opacity: 1;
z-index: 9;
}
.editor-toolbar.fullscreen::before {
width: 20px;
height: 50px;
background: linear-gradient(to right, rgb(255, 255, 255) 0, rgba(255, 255, 255, 0) 100%);
position: fixed;
top: 0;
left: 0;
margin: 0;
padding: 0;
}
.editor-toolbar.fullscreen::after {
width: 20px;
height: 50px;
background: linear-gradient(to right, rgba(255, 255, 255, 0) 0, rgb(255, 255, 255) 100%);
position: fixed;
top: 0;
right: 0;
margin: 0;
padding: 0;
}
.editor-toolbar a {
display: inline-block;
text-align: center;
text-decoration: none !important;
color: #2c3e50 !important;
width: 30px;
height: 30px;
margin: 0;
border: 1px solid transparent;
border-radius: 3px;
cursor: pointer;
}
.editor-toolbar a.active {
background: #fcfcfc;
border-color: #95a5a6;
}
.editor-toolbar a:hover {
background: #fcfcfc;
border-color: #95a5a6;
}
.editor-toolbar a:before {
line-height: 30px;
}
.editor-toolbar a.fa-header-x:after {
font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
font-size: 65%;
vertical-align: text-bottom;
position: relative;
top: 2px;
}
.editor-toolbar a.fa-header-1:after {
content: "1";
}
.editor-toolbar a.fa-header-2:after {
content: "2";
}
.editor-toolbar a.fa-header-3:after {
content: "3";
}
.editor-toolbar a.fa-header-bigger:after {
content: "▲";
}
.editor-toolbar a.fa-header-smaller:after {
content: "▼";
}
.editor-toolbar i.separator {
display: inline-block;
width: 0;
border-left: 1px solid #ddd;
border-right: 1px solid #fff;
color: transparent;
text-indent: -10px;
margin: 0 6px;
}
.editor-toolbar.disabled-for-preview a:not(.no-disable) {
pointer-events: none;
background: #fff;
border-color: transparent;
text-shadow: inherit;
}
@media only screen and (max-width: 700px) {
.editor-toolbar a.no-mobile {
display: none;
}
}
.editor-statusbar {
padding: 8px 10px;
font-size: 12px;
color: #999;
text-align: right;
}
.editor-statusbar span {
display: inline-block;
min-width: 4em;
margin-left: 1em;
}
.editor-statusbar .lines:before {
content: "lines: ";
}
.editor-statusbar .words:before {
content: "words: ";
}
.editor-statusbar .characters:before {
content: "characters: ";
}
.editor-preview {
padding: 10px;
background: #fafafa;
overflow: auto;
display: none;
box-sizing: border-box;
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
z-index: 7;
}
.editor-preview > p {
margin-top: 0;
}
.editor-preview pre {
background: #eee;
margin-bottom: 10px;
}
.editor-preview table td {
border: 1px solid #ddd;
padding: 5px;
}
.editor-preview table th {
border: 1px solid #ddd;
padding: 5px;
}
.editor-preview-side {
padding: 10px;
background: #fafafa;
overflow: auto;
display: none;
box-sizing: border-box;
position: fixed;
bottom: 0;
width: 50%;
top: 50px;
right: 0;
z-index: 9;
border: 1px solid #ddd;
}
.editor-preview-side > p {
margin-top: 0;
}
.editor-preview-side pre {
background: #eee;
margin-bottom: 10px;
}
.editor-preview-side table td {
border: 1px solid #ddd;
padding: 5px;
}
.editor-preview-side table th {
border: 1px solid #ddd;
padding: 5px;
}
.editor-preview-active {
display: block;
}
.editor-preview-active-side {
display: block;
}
.CodeMirror-wrap pre {
word-wrap: break-word;
white-space: pre-wrap;
word-break: normal;
}
.cm-tab-wrap-hack:after {
content: "";
}
span.CodeMirror-selectedtext {
background: 0 0;
}
.editor-wrapper input.title:focus {
opacity: 0.8;
}
.editor-wrapper input.title:hover {
opacity: 0.8;
}
File diff suppressed because one or more lines are too long
+184
View File
@@ -0,0 +1,184 @@
@charset 'UTF-8';
/* Slider */
.slick-loading .slick-list {
background: #fff url("../../images/ajax-loader.gif") center center no-repeat;
}
/* Icons */
@font-face {
font-family: "slick";
font-weight: normal;
font-style: normal;
src: url("../../fonts/slick/slick.eot");
src: url("../../fonts/slick/slick.eot?#iefix") format("embedded-opentype"),
url("../../fonts/slick/slick.woff") format("woff"),
url("../../fonts/slick/slick.ttf") format("truetype"),
url("../../fonts/slick/slick.svg#slick") format("svg");
}
/* Arrows */
.slick-prev,
.slick-next {
font-size: 0;
line-height: 0;
position: absolute;
top: 50%;
display: block;
width: 20px;
height: 20px;
padding: 0;
-webkit-transform: translate(0, -50%);
-ms-transform: translate(0, -50%);
transform: translate(0, -50%);
cursor: pointer;
color: transparent;
border: none;
outline: none;
background: transparent;
}
.slick-prev:hover,
.slick-prev:focus,
.slick-next:hover,
.slick-next:focus {
color: transparent;
outline: none;
background: transparent;
}
.slick-prev:hover:before,
.slick-prev:focus:before,
.slick-next:hover:before,
.slick-next:focus:before {
opacity: 1;
}
.slick-prev.slick-disabled:before,
.slick-next.slick-disabled:before {
opacity: 0.25;
}
.slick-prev:before,
.slick-next:before {
font-family: "slick";
font-size: 20px;
line-height: 1;
opacity: 0.75;
color: white;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.slick-prev {
left: -25px;
}
[dir="rtl"] .slick-prev {
right: -25px;
left: auto;
}
.slick-prev:before {
content: "←";
}
[dir="rtl"] .slick-prev:before {
content: "→";
}
.slick-next {
right: -25px;
}
[dir="rtl"] .slick-next {
right: auto;
left: -25px;
}
.slick-next:before {
content: "→";
}
[dir="rtl"] .slick-next:before {
content: "←";
}
/* Dots */
.slick-dotted.slick-slider {
margin-bottom: 30px;
}
.slick-dots {
position: absolute;
bottom: -25px;
display: block;
width: 100%;
padding: 0;
margin: 0;
list-style: none;
text-align: center;
}
.slick-dots li {
position: relative;
display: inline-block;
width: 20px;
height: 20px;
margin: 0 5px;
padding: 0;
cursor: pointer;
}
.slick-dots li button {
font-size: 0;
line-height: 0;
display: block;
width: 20px;
height: 20px;
padding: 5px;
cursor: pointer;
color: transparent;
border: 0;
outline: none;
background: transparent;
}
.slick-dots li button:hover,
.slick-dots li button:focus {
outline: none;
}
.slick-dots li button:hover:before,
.slick-dots li button:focus:before {
opacity: 1;
}
.slick-dots li button:before {
font-family: "slick";
font-size: 6px;
line-height: 20px;
position: absolute;
top: 0;
left: 0;
width: 20px;
height: 20px;
content: "•";
text-align: center;
opacity: 0.25;
color: black;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.slick-dots li.slick-active button:before {
opacity: 0.75;
color: black;
}
+245
View File
@@ -0,0 +1,245 @@
@charset "UTF-8";
/* Slider */
.slick-loading .slick-list {
background: #fff url("./ajax-loader.gif") center center no-repeat;
}
/* Icons */
@font-face {
font-family: "slick";
src: url("./fonts/slick.eot");
src: url("./fonts/slick.eot?#iefix") format("embedded-opentype"), url("./fonts/slick.woff") format("woff"), url("./fonts/slick.ttf") format("truetype"), url("./fonts/slick.svg#slick") format("svg");
font-weight: normal;
font-style: normal;
}
/* Arrows */
.slick-prev,
.slick-next {
position: absolute;
display: block;
height: 20px;
width: 20px;
line-height: 0px;
font-size: 0px;
cursor: pointer;
background: transparent;
color: transparent;
top: 50%;
-webkit-transform: translate(0, -50%);
-ms-transform: translate(0, -50%);
transform: translate(0, -50%);
padding: 0;
border: none;
outline: none;
}
.slick-prev:hover, .slick-prev:focus,
.slick-next:hover,
.slick-next:focus {
outline: none;
background: transparent;
color: transparent;
}
.slick-prev:hover:before, .slick-prev:focus:before,
.slick-next:hover:before,
.slick-next:focus:before {
opacity: 1;
}
.slick-prev.slick-disabled:before,
.slick-next.slick-disabled:before {
opacity: 0.25;
}
.slick-prev:before,
.slick-next:before {
font-family: "slick";
font-size: 20px;
line-height: 1;
color: white;
opacity: 0.75;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.slick-prev {
left: -25px;
}
[dir=rtl] .slick-prev {
left: auto;
right: -25px;
}
.slick-prev:before {
content: "←";
}
[dir=rtl] .slick-prev:before {
content: "→";
}
.slick-next {
right: -25px;
}
[dir=rtl] .slick-next {
left: -25px;
right: auto;
}
.slick-next:before {
content: "→";
}
[dir=rtl] .slick-next:before {
content: "←";
}
/* Dots */
.slick-dotted.slick-slider {
margin-bottom: 30px;
}
.slick-dots {
position: absolute;
bottom: -25px;
list-style: none;
display: block;
text-align: center;
padding: 0;
margin: 0;
width: 100%;
}
.slick-dots li {
position: relative;
display: inline-block;
height: 20px;
width: 20px;
margin: 0 5px;
padding: 0;
cursor: pointer;
}
.slick-dots li button {
border: 0;
background: transparent;
display: block;
height: 20px;
width: 20px;
outline: none;
line-height: 0px;
font-size: 0px;
color: transparent;
padding: 5px;
cursor: pointer;
}
.slick-dots li button:hover, .slick-dots li button:focus {
outline: none;
}
.slick-dots li button:hover:before, .slick-dots li button:focus:before {
opacity: 1;
}
.slick-dots li button:before {
position: absolute;
top: 0;
left: 0;
content: "•";
width: 20px;
height: 20px;
font-family: "slick";
font-size: 6px;
line-height: 20px;
text-align: center;
color: black;
opacity: 0.25;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.slick-dots li.slick-active button:before {
color: black;
opacity: 0.75;
}
/* Slider */
.slick-slider {
position: relative;
display: block;
box-sizing: border-box;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-ms-touch-action: pan-y;
touch-action: pan-y;
-webkit-tap-highlight-color: transparent;
}
.slick-list {
position: relative;
overflow: hidden;
display: block;
margin: 0;
padding: 0;
}
.slick-list:focus {
outline: none;
}
.slick-list.dragging {
cursor: pointer;
cursor: hand;
}
.slick-slider .slick-track,
.slick-slider .slick-list {
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
-o-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
.slick-track {
position: relative;
left: 0;
top: 0;
display: block;
margin-left: auto;
margin-right: auto;
}
.slick-track:before, .slick-track:after {
content: "";
display: table;
}
.slick-track:after {
clear: both;
}
.slick-loading .slick-track {
visibility: hidden;
}
.slick-slide {
float: left;
height: 100%;
min-height: 1px;
display: none;
}
[dir=rtl] .slick-slide {
float: right;
}
.slick-slide img {
display: block;
}
.slick-slide.slick-loading img {
display: none;
}
.slick-slide.dragging img {
pointer-events: none;
}
.slick-initialized .slick-slide {
display: block;
}
.slick-loading .slick-slide {
visibility: hidden;
}
.slick-vertical .slick-slide {
display: block;
height: auto;
border: 1px solid transparent;
}
.slick-arrow.slick-hidden {
display: none;
}
+152
View File
@@ -0,0 +1,152 @@
@charset "UTF-8";
/* Slider */
.slick-loading .slick-list {
background: #fff url("./ajax-loader.gif") center center no-repeat;
}
/* Icons */
@font-face {
font-family: "slick";
src: url("./fonts/slick.eot");
src: url("./fonts/slick.eot?#iefix") format("embedded-opentype"), url("./fonts/slick.woff") format("woff"), url("./fonts/slick.ttf") format("truetype"), url("./fonts/slick.svg#slick") format("svg");
font-weight: normal;
font-style: normal;
}
/* Arrows */
.slick-prev,
.slick-next {
position: absolute;
display: block;
height: 20px;
width: 20px;
line-height: 0px;
font-size: 0px;
cursor: pointer;
background: transparent;
color: transparent;
top: 50%;
-webkit-transform: translate(0, -50%);
-ms-transform: translate(0, -50%);
transform: translate(0, -50%);
padding: 0;
border: none;
outline: none;
}
.slick-prev:hover, .slick-prev:focus,
.slick-next:hover,
.slick-next:focus {
outline: none;
background: transparent;
color: transparent;
}
.slick-prev:hover:before, .slick-prev:focus:before,
.slick-next:hover:before,
.slick-next:focus:before {
opacity: 1;
}
.slick-prev.slick-disabled:before,
.slick-next.slick-disabled:before {
opacity: 0.25;
}
.slick-prev:before,
.slick-next:before {
font-family: "slick";
font-size: 20px;
line-height: 1;
color: white;
opacity: 0.75;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.slick-prev {
left: -25px;
}
[dir=rtl] .slick-prev {
left: auto;
right: -25px;
}
.slick-prev:before {
content: "←";
}
[dir=rtl] .slick-prev:before {
content: "→";
}
.slick-next {
right: -25px;
}
[dir=rtl] .slick-next {
left: -25px;
right: auto;
}
.slick-next:before {
content: "→";
}
[dir=rtl] .slick-next:before {
content: "←";
}
/* Dots */
.slick-dotted.slick-slider {
margin-bottom: 30px;
}
.slick-dots {
position: absolute;
bottom: -25px;
list-style: none;
display: block;
text-align: center;
padding: 0;
margin: 0;
width: 100%;
}
.slick-dots li {
position: relative;
display: inline-block;
height: 20px;
width: 20px;
margin: 0 5px;
padding: 0;
cursor: pointer;
}
.slick-dots li button {
border: 0;
background: transparent;
display: block;
height: 20px;
width: 20px;
outline: none;
line-height: 0px;
font-size: 0px;
color: transparent;
padding: 5px;
cursor: pointer;
}
.slick-dots li button:hover, .slick-dots li button:focus {
outline: none;
}
.slick-dots li button:hover:before, .slick-dots li button:focus:before {
opacity: 1;
}
.slick-dots li button:before {
position: absolute;
top: 0;
left: 0;
content: "•";
width: 20px;
height: 20px;
font-family: "slick";
font-size: 6px;
line-height: 20px;
text-align: center;
color: black;
opacity: 0.25;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.slick-dots li.slick-active button:before {
color: black;
opacity: 0.75;
}
+92
View File
@@ -0,0 +1,92 @@
/* Slider */
.slick-slider {
position: relative;
display: block;
box-sizing: border-box;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-ms-touch-action: pan-y;
touch-action: pan-y;
-webkit-tap-highlight-color: transparent;
}
.slick-list {
position: relative;
overflow: hidden;
display: block;
margin: 0;
padding: 0;
}
.slick-list:focus {
outline: none;
}
.slick-list.dragging {
cursor: pointer;
cursor: hand;
}
.slick-slider .slick-track,
.slick-slider .slick-list {
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
-o-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
.slick-track {
position: relative;
left: 0;
top: 0;
display: block;
margin-left: auto;
margin-right: auto;
}
.slick-track:before, .slick-track:after {
content: "";
display: table;
}
.slick-track:after {
clear: both;
}
.slick-loading .slick-track {
visibility: hidden;
}
.slick-slide {
float: left;
height: 100%;
min-height: 1px;
display: none;
}
[dir=rtl] .slick-slide {
float: right;
}
.slick-slide img {
display: block;
}
.slick-slide.slick-loading img {
display: none;
}
.slick-slide.dragging img {
pointer-events: none;
}
.slick-initialized .slick-slide {
display: block;
}
.slick-loading .slick-slide {
visibility: hidden;
}
.slick-vertical .slick-slide {
display: block;
height: auto;
border: 1px solid transparent;
}
.slick-arrow.slick-hidden {
display: none;
}
+138
View File
@@ -0,0 +1,138 @@
/* * Hide from both screenreaders and browsers: h5bp.com/u */
.hidden {
display: none !important;
visibility: hidden;
}
/* * Hide only visually, but have it available for screenreaders: h5bp.com/v */
.visuallyhidden {
border: 0;
clip: rect(0 0 0 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
}
/* * Extends the .visuallyhidden class to allow the element to be focusable * when navigated to via the keyboard: h5bp.com/p */
.visuallyhidden.focusable:active,
.visuallyhidden.focusable:focus {
clip: auto;
height: auto;
margin: 0;
overflow: visible;
position: static;
width: auto;
}
/* * Hide visually and from screenreaders, but maintain layout */
.invisible {
visibility: hidden;
}
.clearfix:before,
.clearfix:after {
content: " ";
/* 1 */
display: table;
/* 2 */
}
.clearfix:after {
clear: both;
}
.noflick, .button, .note {
perspective: 1000;
backface-visibility: hidden;
transform: translate3d(0, 0, 0);
}
.sticky-note {
margin: -15px;
}
.note {
float: left;
display: block;
position: relative;
padding: 1em;
width: calc(25% - 30px);
min-height: 300px;
margin: 15px;
border-radius: 5px;
background-color: rgba(115, 102, 255, 0.1);
transition: transform 0.15s;
z-index: 1;
}
.note:hover {
cursor: move;
}
.note.ui-draggable-dragging:nth-child(n) {
box-shadow: 5px 5px 15px 0 rgba(0, 0, 0, 0.3);
transform: scale(1.125) !important;
z-index: 100;
cursor: move;
transition: transform 0.15s;
}
.note textarea {
background-color: transparent;
border: none;
resize: vertical;
font-style: italic;
width: 100%;
padding: 5px;
}
.note textarea:focus {
outline: none;
border: none;
box-shadow: 0 0 0px 1px rgba(0, 0, 0, 0.2) inset;
}
.note textarea.title {
font-size: 24px;
line-height: 1.2;
color: #000000;
height: 64px;
margin-top: 20px;
}
.note textarea.cnt {
min-height: 200px;
}
.note:nth-child(2n) {
background: rgba(255, 51, 100, 0.2);
}
.note:nth-child(3n) {
background: rgba(84, 186, 74, 0.2);
}
.note:nth-child(4n) {
background: rgba(22, 199, 249, 0.1);
}
.note:nth-child(5n) {
background: rgba(255, 170, 5, 0.2);
}
.note:nth-child(6n) {
background: rgba(252, 68, 56, 0.3);
}
/* Button style */
.button {
color: #FFFFFF;
padding: 1em 2em;
text-decoration: none;
transition: transform 0.15s, background 0.01s;
}
.button.remove {
position: absolute;
top: 0;
right: -10px;
color: #999;
}
@media only screen and (max-width: 1199px) {
.note {
min-width: 260px;
min-height: 260px;
}
}
File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More