├── .gitattributes ├── .gitignore ├── README.md ├── conf └── app.ini ├── models ├── models.go ├── rules.go ├── site.go └── user.go ├── modules └── util │ └── common.go ├── public ├── css │ ├── bootstrap-table.css │ ├── bootstrap-theme.css │ ├── bootstrap-theme.css.map │ ├── bootstrap-theme.min.css │ ├── bootstrap.css │ ├── bootstrap.css.map │ ├── bootstrap.min.css │ ├── datepicker.css │ ├── datepicker3.css │ ├── style.css │ └── styles.css ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.svg │ ├── glyphicons-halflings-regular.ttf │ └── glyphicons-halflings-regular.woff ├── js │ ├── bootstrap-datepicker.js │ ├── bootstrap-table.js │ ├── bootstrap.js │ ├── bootstrap.min.js │ ├── chart-data.js │ ├── chart.min.js │ ├── easypiechart-data.js │ ├── easypiechart.js │ ├── html5shiv.min.js │ ├── jquery-1.11.1.min.js │ ├── lumino.glyphs.js │ └── respond.min.js └── tables │ ├── data1.json │ └── data2.json ├── routers ├── admin.go ├── index.go ├── rules.go ├── site.go └── user.go ├── server.go ├── setting └── setting.go └── templates ├── AdminIndex.html ├── EditRule.html ├── EditSite.html ├── EditUser.html ├── error.html ├── index.html ├── login.html ├── newRule.html ├── newSite.html ├── newUser.html ├── proxy.tmpl ├── rules.html └── user.html /.gitattributes: -------------------------------------------------------------------------------- 1 | *.js linguist-language=golang 2 | *.css linguist-language=golang 3 | *.html linguist-language=golang 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .vscode 3 | server 4 | .iml 5 | release 6 | conf 7 | sql 8 | tmp 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # X-WAF 2 | 3 | X-WAF是一款适用中、小企业的云WAF系统,让中、小企业也可以非常方便地拥有自己的免费云WAF。 4 | 5 | 文档地址:[https://waf.xsec.io/](https://waf.xsec.io/) 6 | 7 | # 主要特性 8 | 9 | - 支持对常见WEB攻击的防御,如sql注入、xss、路径穿越,阻断扫描器的扫描等 10 | - 对持对CC攻击的防御 11 | - waf为反向模式,后端保护的服务器可直接用内网IP,不需暴露在公网中 12 | - 支持IP、URL、Referer、User-Agent、Get、Post、Cookies参数型的防御策略 13 | - 安装、部署与维护非常简单 14 | - 支持在线管理waf规则 15 | - 支持在线管理后端服务器 16 | - 多台waf的配置可自动同步 17 | - 跨平台,支持在linux、unix、mac和windows操作系统中部署 18 | 19 | # 架构简介 20 | x-waf由waf自身与Waf管理后台组成: 21 | 22 | - [waf](https://github.com/xsec-lab/x-waf):基于openresty + lua开发。 23 | - [waf管理后台](https://github.com/xsec-lab/x-waf-admin):采用golang + xorm + macrom开发的,支持二进制的形式部署。 24 | 25 | waf和waf-admin必须同时部署在每一台云WAF服务器中。 26 | 27 | # 下载安装 28 | ## waf安装 29 | ### centos平台 30 | 31 | 从[openresty](http://openresty.org/en/download.html)官方下载最新版本的源码包。 32 | 33 | 编译安装openresty: 34 | 35 | ```bash 36 | yum -y install pcre pcre-devel 37 | wget https://openresty.org/download/openresty-1.9.15.1.tar.gz 38 | tar -zxvf openresty-1.9.15.1.tar.gz 39 | cd openresty-1.9.15.1 40 | ./configure 41 | gmake && gmake install 42 | 43 | /usr/local/openresty/nginx/sbin/nginx -t 44 | nginx: the configuration file /usr/local/openresty/nginx/conf/nginx.conf syntax is ok 45 | nginx: configuration file /usr/local/openresty/nginx/conf/nginx.conf test is successful 46 | /usr/local/openresty/nginx/sbin/nginx 47 | ``` 48 | 49 | ### ubuntu平台安装 50 | 51 | 编译安装openresty: 52 | 53 | ```bash 54 | apt-get install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl make build-essential 55 | sudo ln -s /sbin/ldconfig /usr/bin/ldconfig 56 | wget https://openresty.org/download/openresty-1.9.15.1.tar.gz 57 | tar -zxvf openresty-1.9.15.1.tar.gz 58 | cd openresty-1.9.15.1 59 | make && sudo make install 60 | ``` 61 | 62 | ## 安装waf管理后台x-waf-admin 63 | 64 | ### 二进制安装 65 | 66 | 直接从github中下载对应操作系统的二进制版本,https://github.com/xsec-lab/x-waf-admin/releases 67 | 68 | ### 源码安装 69 | 70 | - 首先需要搭建好go语言开发环境,可以参考[Go Web 编程](https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/01.1.md) 71 | - 安装依赖包 72 | ```bash 73 | go get gopkg.in/macaron.v1 74 | go get gopkg.in/ini.v1 75 | go get github.com/go-sql-driver/mysql 76 | go get github.com/go-xorm/xorm 77 | go get github.com/xsec-lab/x-waf-admin 78 | ``` 79 | 80 | - 从github中下载最新的版本 81 | - 执行go build server.go编译出二进制版本,然后将server、conf、publib和templates目录一起打包上传到服务器中即可运行。 82 | 83 | 84 | ## 后端服务器管理 85 | 86 | 当多台waf做负载均衡时,只需登录其中一台进行管理即可,多台waf的所有的配置信息会自动同步到所有的服务器中。 87 | 88 | 管理地址为:http://ip:5000/login/ 89 | 90 | 管理后台的默认的账户及口令分别为:admin,x@xsec.io,请管理员部署系统后第一时间修改密码,防止被攻击者使用默认口令登入胡乱改动waf的配置。 91 | 92 | ### 新增站点 93 | 94 | 在`Site Manager`选项中,可以新增一个后端服务器,需要填写以下内容: 95 | 96 | - Site Name,表示要加入waf的网站的域名 97 | - 80表示该网站监听的端口 98 | - Backend,表示有多少个后台app server,可以写多个(换行分割),例如: 99 | ```bash 100 | 1.1.1.1:80 101 | 8.8.8.8:80 102 | ``` 103 | 104 | - SSL Status,表示是否启用ssl,参数为on或off(如果要启用的话,需要在nginx中配置有效的证书) 105 | - Debug Level,表示日志级别,可选的参数有`debug, info, notice, warn, error, crit, alert, emerg` 106 | 107 | ### 站点配置同步 108 | 109 | 新增站点后,需要在后台同步站点信息后方可生效,同步的方式有2种: 110 | 111 | 1. 全部同步 112 | 1. 针对某一新增的站点进行同步 113 | 114 | ## waf规则管理 115 | 116 | 在`waf Rules`选项中,可以修改waf的规则,修改完后可以点击“同步全部策略”按钮,将最新的规则同步到所有的服务器并让openresty重新加载。 -------------------------------------------------------------------------------- /conf/app.ini: -------------------------------------------------------------------------------- 1 | RUN_MODE = dev 2 | ;RUN_MODE = prod 3 | 4 | [server] 5 | HTTP_PORT = 5000 6 | API_KEY = xsec.io||secdevops.cn 7 | NGINX_BIN = /usr/local/openresty/nginx/sbin/nginx 8 | NGINX_VHOSTS = /usr/local/openresty/nginx/conf/vhosts/ 9 | API_SERVERS = 127.0.0.1, 8.8.8.8 10 | 11 | [database] 12 | USER = waf-admin 13 | PASSWD = passw0rd 14 | HOST = 127.0.0.1:3306 15 | NAME = waf 16 | 17 | [waf] 18 | RULE_PATH = /usr/local/openresty/nginx/conf/x-waf/rules/ 19 | -------------------------------------------------------------------------------- /models/models.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "fmt" 5 | "log" 6 | 7 | "github.com/xsec-lab/x-waf-admin/setting" 8 | 9 | _ "github.com/go-sql-driver/mysql" 10 | "github.com/go-xorm/xorm" 11 | ) 12 | 13 | var ( 14 | Engine *xorm.Engine 15 | err error 16 | ) 17 | 18 | func init() { 19 | sec := setting.Cfg.Section("database") 20 | Engine, err = xorm.NewEngine("mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8", 21 | sec.Key("USER").String(), 22 | sec.Key("PASSWD").String(), 23 | sec.Key("HOST").String(), 24 | sec.Key("NAME").String())) 25 | if err != nil { 26 | log.Panicf("Faild to connect to database, err:%v", err) 27 | } 28 | 29 | // log.Println(Engine, err) 30 | Engine.Sync2(new(Site)) 31 | Engine.Sync2(new(User)) 32 | Engine.Sync2(new(Rules)) 33 | 34 | ret, err := Engine.IsTableEmpty(new(User)) 35 | if err == nil && ret { 36 | log.Printf("create new user:%v, password:%v\n", "admin", "x@xsec.io") 37 | NewUser("admin", "x@xsec.io") 38 | } 39 | 40 | ret, err = Engine.IsTableEmpty(new(Rules)) 41 | if err == nil && ret { 42 | log.Println("Insert default waf rules") 43 | Engine.Exec(DefaultRules) 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /models/rules.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import "log" 4 | 5 | type Rules struct { 6 | Id int64 7 | RuleType string `xorm:"varchar(25) not null"` 8 | RuleItem string `xorm:"varchar(255) not null"` 9 | } 10 | 11 | var RuleInfo = map[string]string{ 12 | "args": "args规则", 13 | "blackip": "黑名单", 14 | "whiteip": "白名单", 15 | "cookie": "cookies规则", 16 | "url": "url规则", 17 | "useragent": "UserAgent规则", 18 | "headers": "headers规则", 19 | "whiteUrl": "URL白名单", 20 | "post": "post规则", 21 | } 22 | 23 | const DefaultRules = `INSERT INTO rules VALUES (4,'args','\\.\\./'),(2,'blackip','8.8.8.8'),(3,'blackip','1.1.1.1'),(5,'args','\\:\\$'),(6,'args','\\$\\{'),(7,'args','select.+(from|limit)'),(8,'args','(?:(union(.*?)select))'),(9,'args','having|rongjitest'),(10,'args','sleep\\((\\s*)(\\d*)(\\s*)\\)'),(11,'args','benchmark\\((.*)\\,(.*)\\)'),(12,'args','base64_decode\\('),(13,'args','(?:from\\W+information_schema\\W)'),(14,'args','(?:(?:current_)user|database|schema|connection_id)\\s*\\('),(15,'args','(?:etc\\/\\W*passwd)'),(16,'args','into(\\s+)+(?:dump|out)file\\s*'),(17,'args','group\\s+by.+\\('),(18,'args','xwork.MethodAccessor'),(19,'args','(?:define|eval|file_get_contents|include|require|require_once|shell_exec|phpinfo|system|passthru|preg_\\w+|execute|echo|print|print_r|var_dump|(fp)open|alert|showmodaldialog)\\('),(20,'args','xwork\\.MethodAccessor'),(21,'args','(gopher|doc|php|glob|file|phar|zlib|ftp|ldap|dict|ogg|data)\\:\\/'),(22,'args','java\\.lang'),(23,'args','\\$_(GET|post|cookie|files|session|env|phplib|GLOBALS|SERVER)\\['),(24,'args','\\<(iframe|script|body|img|layer|div|meta|style|base|object|input)'),(25,'args','(onmouseover|onerror|onload)\\='),(26,'cookie','\\.\\./'),(27,'cookie','\\:\\$'),(28,'cookie','\\$\\{'),(29,'cookie','select.+(from|limit)'),(30,'cookie','(?:(union(.*?)select))'),(31,'cookie','having|rongjitest'),(32,'cookie','sleep\\((\\s*)(\\d*)(\\s*)\\)'),(33,'cookie','benchmark\\((.*)\\,(.*)\\)'),(34,'cookie','base64_decode\\('),(35,'cookie','(?:from\\W+information_schema\\W)'),(36,'cookie','(?:(?:current_)user|database|schema|connection_id)\\s*\\('),(37,'cookie','(?:etc\\/\\W*passwd)'),(38,'cookie','into(\\s+)+(?:dump|out)file\\s*'),(39,'cookie','group\\s+by.+\\('),(40,'cookie','xwork.MethodAccessor'),(41,'cookie','(?:define|eval|file_get_contents|include|require|require_once|shell_exec|phpinfo|system|passthru|preg_\\w+|execute|echo|print|print_r|var_dump|(fp)open|alert|showmodaldialog)\\('),(42,'cookie','xwork\\.MethodAccessor'),(43,'cookie','(gopher|doc|php|glob|file|phar|zlib|ftp|ldap|dict|ogg|data)\\:\\/'),(44,'cookie','java\\.lang'),(45,'cookie','\\$_(GET|post|cookie|files|session|env|phplib|GLOBALS|SERVER)\\['),(46,'post','\\.\\./'),(47,'post','select.+(from|limit)'),(48,'post','(?:(union(.*?)select))'),(49,'post','having|rongjitest'),(50,'post','sleep\\((\\s*)(\\d*)(\\s*)\\)'),(51,'post','benchmark\\((.*)\\,(.*)\\)'),(52,'post','base64_decode\\('),(53,'post','(?:from\\W+information_schema\\W)'),(54,'post','(?:(?:current_)user|database|schema|connection_id)\\s*\\('),(55,'post','(?:etc\\/\\W*passwd)'),(56,'post','into(\\s+)+(?:dump|out)file\\s*'),(57,'post','group\\s+by.+\\('),(58,'post','xwork.MethodAccessor'),(59,'post','(?:define|eval|file_get_contents|include|require|require_once|shell_exec|phpinfo|system|passthru|preg_\\w+|execute|echo|print|print_r|var_dump|(fp)open|alert|showmodaldialog)\\('),(60,'post','xwork\\.MethodAccessor'),(61,'post','(gopher|doc|php|glob|file|phar|zlib|ftp|ldap|dict|ogg|data)\\:\\/'),(62,'post','java\\.lang'),(63,'post','\\$_(GET|post|cookie|files|session|env|phplib|GLOBALS|SERVER)\\['),(64,'post','\\<(iframe|script|body|img|layer|div|meta|style|base|object|input)'),(65,'post','(onmouseover|onerror|onload)\\='),(66,'url','\\.(htaccess|bash_history)'),(67,'url','\\.(bak|inc|old|mdb|sql|backup|java|class|tgz|gz|tar|zip)$'),(68,'url','(phpmyadmin|jmx-console|admin-console|jmxinvokerservlet)'),(69,'url','java\\.lang'),(70,'url','\\.(svn|git|sql|bak)\\/'),(71,'url','/(attachments|upimg|images|css|uploadfiles|html|uploads|templets|static|template|data|inc|forumdata|upload|includes|cache|avatar)/(\\\\w+).(php|jsp)'),(72,'useragent','(HTTrack|harvest|audit|dirbuster|pangolin|nmap|sqln|-scan|hydra|Parser|libwww|BBBike|sqlmap|w3af|owasp|Nikto|fimap|havij|PycURL|zmeu|BabyKrokodil|netsparker|httperf|bench)'),(73,'whiteUrl','/news/'),(74,'whiteip','8.8.8.8'),(75,'args','and\\s+(1=1|1=2)'),(75,'args','and\\s+(1=1|1=2)');` 24 | 25 | func ListRules() (rules []Rules, err error) { 26 | rules = make([]Rules, 0) 27 | err = Engine.Find(&rules) 28 | log.Println(err, rules) 29 | return rules, err 30 | } 31 | 32 | // list rules by rule_type 33 | func ListRulesByType(ruleType string) (rules []Rules, err error) { 34 | rules = make([]Rules, 0) 35 | err = Engine.Where("rule_type = ?", ruleType).Find(&rules) 36 | return rules, err 37 | } 38 | 39 | func ListAllRules() (rulesMap map[string][]Rules, err error) { 40 | rulesMap = make(map[string][]Rules) 41 | rules := make([]Rules, 0) 42 | err = Engine.Find(&rules) 43 | for _, item := range rules { 44 | rulesMap[item.RuleType] = append(rulesMap[item.RuleType], item) 45 | } 46 | return rulesMap, err 47 | } 48 | 49 | func NewRule(ruleType string, rule string) (err error) { 50 | _, err = Engine.Insert(&Rules{RuleType: ruleType, RuleItem: rule}) 51 | return err 52 | } 53 | 54 | func EditRule(ruleId int64, ruleItem string) (err error) { 55 | Rule := new(Rules) 56 | Engine.Id(ruleId).Get(Rule) 57 | Rule.RuleItem = ruleItem 58 | _, err = Engine.Id(ruleId).Update(Rule) 59 | return err 60 | } 61 | 62 | func DelRule(ruleId int64) (err error) { 63 | _, err = Engine.Delete(&Rules{Id: ruleId}) 64 | return err 65 | } 66 | -------------------------------------------------------------------------------- /models/site.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "log" 5 | "time" 6 | ) 7 | 8 | // debuglevel: debug, info, notice, warn, error, crit, alert, emerg 9 | // ssl: on, off 10 | type Site struct { 11 | Id int64 12 | SiteName string `xorm:"unique"` 13 | Port int 14 | BackendAddr []string 15 | UnrealAddr []string 16 | Ssl string `xorm:"varchar(10) notnull default 'off'"` 17 | DebugLevel string `xorm:"varchar(10) notnull default 'error'"` 18 | LastChange time.Time `xorm:"updated"` 19 | Version int `xorm:"version"` // 乐观锁 20 | } 21 | 22 | func ListSite() (sites []Site, err error) { 23 | sites = make([]Site, 0) 24 | err = Engine.Find(&sites) 25 | log.Println(err, sites) 26 | return sites, err 27 | } 28 | 29 | func ListSiteById(Id int64) (sites []Site, err error) { 30 | sites = make([]Site, 0) 31 | err = Engine.Id(Id).Find(&sites) 32 | log.Println(err, sites) 33 | return sites, err 34 | } 35 | 36 | func NewSite(siteName string, Port int, BackendAddr []string, UnrealAddr []string, SSL string, DebugLevel string) (err error) { 37 | if SSL == "" { 38 | SSL = "off" 39 | } 40 | if DebugLevel == "" { 41 | DebugLevel = "error" 42 | } 43 | 44 | _, err = Engine.Insert(&Site{SiteName: siteName, Port: Port, BackendAddr: BackendAddr, UnrealAddr: UnrealAddr, Ssl: SSL, DebugLevel: DebugLevel}) 45 | return err 46 | } 47 | 48 | func UpdateSite(Id int64, SiteName string, Port int, BackendAddr []string, UnrealAddr []string, SSL string, DebugLevel string) (err error) { 49 | if SSL == "" { 50 | SSL = "off" 51 | } 52 | if DebugLevel == "" { 53 | DebugLevel = "error" 54 | } 55 | 56 | site := new(Site) 57 | Engine.Id(Id).Get(site) 58 | site.SiteName = SiteName 59 | site.Port = Port 60 | site.BackendAddr = BackendAddr 61 | site.UnrealAddr = UnrealAddr 62 | site.Ssl = SSL 63 | site.DebugLevel = DebugLevel 64 | _, err = Engine.Id(Id).Update(site) 65 | return err 66 | } 67 | 68 | func DelSite(id int64) (err error) { 69 | _, err = Engine.Delete(&Site{Id: id}) 70 | return err 71 | } 72 | -------------------------------------------------------------------------------- /models/user.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "github.com/xsec-lab/x-waf-admin/modules/util" 5 | "log" 6 | ) 7 | 8 | type User struct { 9 | Id int64 10 | UserName string `xrom:"unique"` 11 | Password string `xrom:"varchar(50) notnull"` 12 | } 13 | 14 | func ListUser() (users []User, err error) { 15 | users = make([]User, 0) 16 | err = Engine.Find(&users) 17 | log.Println(err, users) 18 | return users, err 19 | } 20 | 21 | func NewUser(username, password string) (err error) { 22 | encryptpass := util.EncryptPass(password) 23 | _, err = Engine.Insert(&User{UserName: username, Password: encryptpass}) 24 | return err 25 | } 26 | 27 | func UpdateUser(id int64, username, password string) (err error) { 28 | user := new(User) 29 | _, err = Engine.Id(id).Get(user) 30 | user.UserName = username 31 | user.Password = util.EncryptPass(password) 32 | _, err = Engine.Id(id).Update(user) 33 | 34 | return err 35 | } 36 | 37 | func DelUser(id int64) (err error) { 38 | _, err = Engine.Delete(&User{Id: id}) 39 | return err 40 | } 41 | 42 | func Auth(username, password string) (ret bool, err error) { 43 | encryptpass := util.EncryptPass(password) 44 | log.Println(username, password, encryptpass) 45 | userAuth := &User{UserName: username, Password: encryptpass} 46 | has, err := Engine.Get(userAuth) 47 | log.Println(has, err, userAuth) 48 | 49 | if has { 50 | ret = true 51 | } 52 | return ret, err 53 | } 54 | -------------------------------------------------------------------------------- /modules/util/common.go: -------------------------------------------------------------------------------- 1 | package util 2 | 3 | import ( 4 | "crypto/md5" 5 | "fmt" 6 | "log" 7 | "os" 8 | "os/exec" 9 | "path" 10 | "strings" 11 | 12 | "github.com/xsec-lab/x-waf-admin/setting" 13 | ) 14 | 15 | type Message struct { 16 | Status int 17 | Message string 18 | } 19 | 20 | func MakeMd5(srcStr string) string { 21 | return fmt.Sprintf("%x", md5.Sum([]byte(srcStr))) 22 | } 23 | 24 | func EncryptPass(src string) string { 25 | return fmt.Sprintf("%s", MakeMd5(MakeMd5(src)[5:10])) 26 | } 27 | 28 | func WriteNginxConf(proxyConfig string, siteName string, vhostPath string) (err error) { 29 | proxyConfigFile := path.Join(vhostPath, fmt.Sprintf("%v.conf", siteName)) 30 | log.Println(proxyConfigFile) 31 | fileConfig, err := os.Create(proxyConfigFile) 32 | log.Println(fileConfig, err) 33 | defer fileConfig.Close() 34 | proxyConfig = strings.Replace(proxyConfig, "\r\n", "\n", -1) 35 | _, err = fileConfig.WriteString(proxyConfig) 36 | 37 | return err 38 | } 39 | 40 | func ReloadNginx() (err error) { 41 | log.Println("start to Reload nginx") 42 | ret, err := exec.Command(setting.NginxBin, "-t").Output() 43 | log.Println(ret, err) 44 | if err == nil { 45 | ret1, err := exec.Command(setting.NginxBin, "-s", "reload").Output() 46 | log.Println(ret1, err) 47 | } 48 | return err 49 | } 50 | -------------------------------------------------------------------------------- /public/css/bootstrap-table.css: -------------------------------------------------------------------------------- 1 | .table { 2 | margin-bottom: 0 !important; 3 | border-bottom: 1px solid #dddddd; 4 | border-collapse: collapse !important; 5 | border-radius: 1px; 6 | } 7 | 8 | .fixed-table-container { 9 | position: relative; 10 | clear: both; 11 | border: 1px solid #dddddd; 12 | border-radius: 4px; 13 | -webkit-border-radius: 4px; 14 | -moz-border-radius: 4px; 15 | } 16 | 17 | .fixed-table-header { 18 | overflow: hidden; 19 | border-radius: 4px 4px 0 0; 20 | -webkit-border-radius: 4px 4px 0 0; 21 | -moz-border-radius: 4px 4px 0 0; 22 | } 23 | 24 | .fixed-table-body { 25 | overflow-x: auto; 26 | overflow-y: auto; 27 | height: 100%; 28 | } 29 | 30 | .fixed-table-container table { 31 | width: 100%; 32 | } 33 | 34 | .fixed-table-container thead th { 35 | height: 0; 36 | padding: 0; 37 | margin: 0; 38 | border-left: 1px solid #dddddd; 39 | } 40 | 41 | .fixed-table-container thead th:first-child { 42 | border-left: none; 43 | } 44 | 45 | .fixed-table-container thead th .th-inner { 46 | padding: 8px; 47 | line-height: 24px; 48 | vertical-align: top; 49 | overflow: hidden; 50 | text-overflow: ellipsis; 51 | white-space: nowrap; 52 | } 53 | 54 | .fixed-table-container thead th .sortable { 55 | cursor: pointer; 56 | } 57 | 58 | .fixed-table-container tbody td { 59 | border-left: 1px solid #dddddd; 60 | } 61 | 62 | .fixed-table-container tbody tr:first-child td { 63 | border-top: none; 64 | } 65 | 66 | .fixed-table-container tbody td:first-child { 67 | border-left: none; 68 | } 69 | 70 | /* the same color with .active */ 71 | .fixed-table-container tbody .selected td { 72 | background-color: #f5f5f5; 73 | } 74 | 75 | .fixed-table-container .bs-checkbox { 76 | text-align: center; 77 | } 78 | 79 | .fixed-table-container .bs-checkbox .th-inner { 80 | padding: 8px 0; 81 | } 82 | 83 | .fixed-table-container input[type="radio"], 84 | .fixed-table-container input[type="checkbox"] { 85 | margin: 0 auto !important; 86 | } 87 | 88 | .fixed-table-container .no-records-found { 89 | text-align: center; 90 | } 91 | 92 | 93 | .fixed-table-pagination .pagination, 94 | .fixed-table-pagination .pagination-detail { 95 | margin-top: 10px; 96 | margin-bottom: 10px; 97 | } 98 | 99 | .fixed-table-pagination .pagination a { 100 | padding: 6px 12px; 101 | line-height: 1.428571429; 102 | } 103 | 104 | .fixed-table-pagination .pagination-info { 105 | line-height: 34px; 106 | margin-right: 5px; 107 | } 108 | 109 | .fixed-table-pagination .btn-group { 110 | position: relative; 111 | display: inline-block; 112 | vertical-align: middle; 113 | } 114 | 115 | .fixed-table-pagination .dropup .dropdown-menu { 116 | margin-bottom: 0; 117 | } 118 | 119 | .fixed-table-pagination .page-list { 120 | display: inline-block; 121 | } 122 | 123 | .fixed-table-toolbar .columns { 124 | margin-left: 5px; 125 | } 126 | 127 | .fixed-table-toolbar .columns label { 128 | display: block; 129 | padding: 3px 20px; 130 | clear: both; 131 | font-weight: normal; 132 | line-height: 1.428571429; 133 | } 134 | 135 | .fixed-table-toolbar .bars, 136 | .fixed-table-toolbar .search, 137 | .fixed-table-toolbar .columns { 138 | position: relative; 139 | margin-top: 10px; 140 | margin-bottom: 10px; 141 | line-height: 34px; 142 | } 143 | 144 | .fixed-table-pagination li.disabled a { 145 | pointer-events: none; 146 | cursor: default; 147 | } 148 | 149 | .fixed-table-loading { 150 | display: none; 151 | position: absolute; 152 | top: 42px; 153 | right: 0; 154 | bottom: 0; 155 | left: 0; 156 | z-index: 99; 157 | background-color: #fff; 158 | text-align: center; 159 | } 160 | 161 | .fixed-table-body .card-view .title { 162 | font-weight: bold; 163 | display: inline-block; 164 | min-width: 30%; 165 | text-align: left !important; 166 | } 167 | 168 | /* support bootstrap 2 */ 169 | .fixed-table-body thead th .th-inner { 170 | box-sizing: border-box; 171 | } 172 | 173 | .table th, .table td { 174 | vertical-align: middle; 175 | box-sizing: border-box; 176 | } 177 | 178 | .fixed-table-toolbar .dropdown-menu { 179 | text-align: left; 180 | max-height: 300px; 181 | overflow: auto; 182 | } 183 | 184 | .fixed-table-toolbar .btn-group>.btn-group { 185 | display: inline-block; 186 | margin-left: -1px !important; 187 | } 188 | 189 | .fixed-table-toolbar .btn-group>.btn-group>.btn { 190 | border-radius: 0; 191 | } 192 | 193 | .fixed-table-toolbar .btn-group>.btn-group:first-child>.btn { 194 | border-top-left-radius: 4px; 195 | border-bottom-left-radius: 4px; 196 | } 197 | 198 | .fixed-table-toolbar .btn-group>.btn-group:last-child>.btn { 199 | border-top-right-radius: 4px; 200 | border-bottom-right-radius: 4px; 201 | } 202 | 203 | .table>thead>tr>th { 204 | vertical-align: bottom; 205 | border-bottom: 2px solid #ddd; 206 | } 207 | 208 | /* support bootstrap 3 */ 209 | .table thead>tr>th { 210 | padding: 0; 211 | margin: 0; 212 | } 213 | 214 | .pull-right .dropdown-menu { 215 | right: 0; 216 | left: auto; 217 | } 218 | 219 | /* calculate scrollbar width */ 220 | p.fixed-table-scroll-inner { 221 | width: 100%; 222 | height: 200px; 223 | } 224 | 225 | div.fixed-table-scroll-outer { 226 | top: 0; 227 | left: 0; 228 | visibility: hidden; 229 | width: 200px; 230 | height: 150px; 231 | overflow: hidden; 232 | } -------------------------------------------------------------------------------- /public/css/bootstrap-theme.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"bootstrap-theme.css","sources":["less/theme.less","less/mixins/vendor-prefixes.less","bootstrap-theme.css","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAeA;;;;;;EAME,0CAAA;EC+CA,6FAAA;EACQ,qFAAA;EC5DT;AFiBC;;;;;;;;;;;;EC0CA,0DAAA;EACQ,kDAAA;EC7CT;AFqCC;;EAEE,wBAAA;EEnCH;AFwCD;EG/CI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EA+B2C,2BAAA;EAA2B,oBAAA;EE7BvE;AFAC;;EAEE,2BAAA;EACA,8BAAA;EEEH;AFCC;;EAEE,2BAAA;EACA,uBAAA;EECH;AFEC;;EAEE,2BAAA;EACA,wBAAA;EEAH;AFeD;EGhDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EE0BD;AFxBC;;EAEE,2BAAA;EACA,8BAAA;EE0BH;AFvBC;;EAEE,2BAAA;EACA,uBAAA;EEyBH;AFtBC;;EAEE,2BAAA;EACA,wBAAA;EEwBH;AFRD;EGjDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EEkDD;AFhDC;;EAEE,2BAAA;EACA,8BAAA;EEkDH;AF/CC;;EAEE,2BAAA;EACA,uBAAA;EEiDH;AF9CC;;EAEE,2BAAA;EACA,wBAAA;EEgDH;AF/BD;EGlDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EE0ED;AFxEC;;EAEE,2BAAA;EACA,8BAAA;EE0EH;AFvEC;;EAEE,2BAAA;EACA,uBAAA;EEyEH;AFtEC;;EAEE,2BAAA;EACA,wBAAA;EEwEH;AFtDD;EGnDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EEkGD;AFhGC;;EAEE,2BAAA;EACA,8BAAA;EEkGH;AF/FC;;EAEE,2BAAA;EACA,uBAAA;EEiGH;AF9FC;;EAEE,2BAAA;EACA,wBAAA;EEgGH;AF7ED;EGpDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EE0HD;AFxHC;;EAEE,2BAAA;EACA,8BAAA;EE0HH;AFvHC;;EAEE,2BAAA;EACA,uBAAA;EEyHH;AFtHC;;EAEE,2BAAA;EACA,wBAAA;EEwHH;AF7FD;;ECbE,oDAAA;EACQ,4CAAA;EC8GT;AFvFD;;EGvEI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHsEF,2BAAA;EE6FD;AF3FD;;;EG5EI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH4EF,2BAAA;EEiGD;AFvFD;EG1FI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ECnBF,qEAAA;EJ4GA,oBAAA;EC9CA,6FAAA;EACQ,qFAAA;EC4IT;AFlGD;EG1FI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EF2CF,0DAAA;EACQ,kDAAA;ECqJT;AF/FD;;EAEE,gDAAA;EEiGD;AF7FD;EG5GI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ECnBF,qEAAA;EFgOD;AFrGD;EG5GI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EF2CF,yDAAA;EACQ,iDAAA;EC0KT;AF9GD;;EAWI,2CAAA;EEuGH;AFlGD;;;EAGE,kBAAA;EEoGD;AF1FD;EACE,+CAAA;EC3FA,4FAAA;EACQ,oFAAA;ECwLT;AFlFD;EGtJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH8IF,uBAAA;EE8FD;AFzFD;EGvJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH8IF,uBAAA;EEsGD;AFhGD;EGxJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH8IF,uBAAA;EE8GD;AFvGD;EGzJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH8IF,uBAAA;EEsHD;AFtGD;EGlKI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED2QH;AFnGD;EG5KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDkRH;AFzGD;EG7KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDyRH;AF/GD;EG9KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDgSH;AFrHD;EG/KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDuSH;AF3HD;EGhLI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED8SH;AF9HD;EGnJI,+MAAA;EACA,0MAAA;EACA,uMAAA;EDoRH;AF1HD;EACE,oBAAA;EC/IA,oDAAA;EACQ,4CAAA;EC4QT;AF3HD;;;EAGE,+BAAA;EGpME,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHkMF,uBAAA;EEiID;AFvHD;ECjKE,mDAAA;EACQ,2CAAA;EC2RT;AFjHD;EG1NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED8UH;AFvHD;EG3NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDqVH;AF7HD;EG5NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED4VH;AFnID;EG7NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDmWH;AFzID;EG9NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED0WH;AF/ID;EG/NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDiXH;AF9ID;EGvOI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHqOF,uBAAA;EC1LA,2FAAA;EACQ,mFAAA;EC+UT","sourcesContent":["\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &:disabled,\n &[disabled] {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-bg, 5%); @end-color: darken(@navbar-default-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-bg; @end-color: lighten(@navbar-inverse-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n}\n\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n &::-moz-placeholder { color: @color; // Firefox\n opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n",null,"// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} -------------------------------------------------------------------------------- /public/css/bootstrap-theme.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.2.0 (http://getbootstrap.com) 3 | * Copyright 2011-2014 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-o-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#2d6ca2));background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#2b669a}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-primary:disabled,.btn-primary[disabled]{background-color:#2d6ca2;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-success:disabled,.btn-success[disabled]{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-info:disabled,.btn-info[disabled]{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-warning:disabled,.btn-warning[disabled]{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-danger:disabled,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f3f3f3));background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:-o-linear-gradient(top,#222 0,#282828 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#222),to(#282828));background-image:linear-gradient(to bottom,#222 0,#282828 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-o-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3071a9));background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-o-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3278b3));background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);background-repeat:repeat-x;border-color:#3278b3}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} -------------------------------------------------------------------------------- /public/css/datepicker.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Datepicker for Bootstrap 3 | * 4 | * Copyright 2012 Stefan Petre 5 | * Improvements by Andrew Rowls 6 | * Licensed under the Apache License v2.0 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | */ 10 | .datepicker { 11 | padding: 4px; 12 | -webkit-border-radius: 4px; 13 | -moz-border-radius: 4px; 14 | border-radius: 4px; 15 | direction: ltr; 16 | /*.dow { 17 | border-top: 1px solid #ddd !important; 18 | }*/ 19 | } 20 | .datepicker-inline { 21 | width: 220px; 22 | } 23 | .datepicker.datepicker-rtl { 24 | direction: rtl; 25 | } 26 | .datepicker.datepicker-rtl table tr td span { 27 | float: right; 28 | } 29 | .datepicker-dropdown { 30 | top: 0; 31 | left: 0; 32 | } 33 | .datepicker-dropdown:before { 34 | content: ''; 35 | display: inline-block; 36 | border-left: 7px solid transparent; 37 | border-right: 7px solid transparent; 38 | border-bottom: 7px solid #ccc; 39 | border-top: 0; 40 | border-bottom-color: rgba(0, 0, 0, 0.2); 41 | position: absolute; 42 | } 43 | .datepicker-dropdown:after { 44 | content: ''; 45 | display: inline-block; 46 | border-left: 6px solid transparent; 47 | border-right: 6px solid transparent; 48 | border-bottom: 6px solid #ffffff; 49 | border-top: 0; 50 | position: absolute; 51 | } 52 | .datepicker-dropdown.datepicker-orient-left:before { 53 | left: 6px; 54 | } 55 | .datepicker-dropdown.datepicker-orient-left:after { 56 | left: 7px; 57 | } 58 | .datepicker-dropdown.datepicker-orient-right:before { 59 | right: 6px; 60 | } 61 | .datepicker-dropdown.datepicker-orient-right:after { 62 | right: 7px; 63 | } 64 | .datepicker-dropdown.datepicker-orient-top:before { 65 | top: -7px; 66 | } 67 | .datepicker-dropdown.datepicker-orient-top:after { 68 | top: -6px; 69 | } 70 | .datepicker-dropdown.datepicker-orient-bottom:before { 71 | bottom: -7px; 72 | border-bottom: 0; 73 | border-top: 7px solid #999; 74 | } 75 | .datepicker-dropdown.datepicker-orient-bottom:after { 76 | bottom: -6px; 77 | border-bottom: 0; 78 | border-top: 6px solid #ffffff; 79 | } 80 | .datepicker > div { 81 | display: none; 82 | } 83 | .datepicker.days div.datepicker-days { 84 | display: block; 85 | } 86 | .datepicker.months div.datepicker-months { 87 | display: block; 88 | } 89 | .datepicker.years div.datepicker-years { 90 | display: block; 91 | } 92 | .datepicker table { 93 | margin: 0; 94 | -webkit-touch-callout: none; 95 | -webkit-user-select: none; 96 | -khtml-user-select: none; 97 | -moz-user-select: none; 98 | -ms-user-select: none; 99 | user-select: none; 100 | } 101 | .datepicker td, 102 | .datepicker th { 103 | text-align: center; 104 | width: 20px; 105 | height: 20px; 106 | -webkit-border-radius: 4px; 107 | -moz-border-radius: 4px; 108 | border-radius: 4px; 109 | border: none; 110 | } 111 | .table-striped .datepicker table tr td, 112 | .table-striped .datepicker table tr th { 113 | background-color: transparent; 114 | } 115 | .datepicker table tr td.day:hover, 116 | .datepicker table tr td.day.focused { 117 | background: #eeeeee; 118 | cursor: pointer; 119 | } 120 | .datepicker table tr td.old, 121 | .datepicker table tr td.new { 122 | color: #999999; 123 | } 124 | .datepicker table tr td.disabled, 125 | .datepicker table tr td.disabled:hover { 126 | background: none; 127 | color: #999999; 128 | cursor: default; 129 | } 130 | .datepicker table tr td.today, 131 | .datepicker table tr td.today:hover, 132 | .datepicker table tr td.today.disabled, 133 | .datepicker table tr td.today.disabled:hover { 134 | background-color: #fde19a; 135 | background-image: -moz-linear-gradient(top, #fdd49a, #fdf59a); 136 | background-image: -ms-linear-gradient(top, #fdd49a, #fdf59a); 137 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a)); 138 | background-image: -webkit-linear-gradient(top, #fdd49a, #fdf59a); 139 | background-image: -o-linear-gradient(top, #fdd49a, #fdf59a); 140 | background-image: linear-gradient(top, #fdd49a, #fdf59a); 141 | background-repeat: repeat-x; 142 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0); 143 | border-color: #fdf59a #fdf59a #fbed50; 144 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 145 | filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); 146 | color: #000; 147 | } 148 | .datepicker table tr td.today:hover, 149 | .datepicker table tr td.today:hover:hover, 150 | .datepicker table tr td.today.disabled:hover, 151 | .datepicker table tr td.today.disabled:hover:hover, 152 | .datepicker table tr td.today:active, 153 | .datepicker table tr td.today:hover:active, 154 | .datepicker table tr td.today.disabled:active, 155 | .datepicker table tr td.today.disabled:hover:active, 156 | .datepicker table tr td.today.active, 157 | .datepicker table tr td.today:hover.active, 158 | .datepicker table tr td.today.disabled.active, 159 | .datepicker table tr td.today.disabled:hover.active, 160 | .datepicker table tr td.today.disabled, 161 | .datepicker table tr td.today:hover.disabled, 162 | .datepicker table tr td.today.disabled.disabled, 163 | .datepicker table tr td.today.disabled:hover.disabled, 164 | .datepicker table tr td.today[disabled], 165 | .datepicker table tr td.today:hover[disabled], 166 | .datepicker table tr td.today.disabled[disabled], 167 | .datepicker table tr td.today.disabled:hover[disabled] { 168 | background-color: #fdf59a; 169 | } 170 | .datepicker table tr td.today:active, 171 | .datepicker table tr td.today:hover:active, 172 | .datepicker table tr td.today.disabled:active, 173 | .datepicker table tr td.today.disabled:hover:active, 174 | .datepicker table tr td.today.active, 175 | .datepicker table tr td.today:hover.active, 176 | .datepicker table tr td.today.disabled.active, 177 | .datepicker table tr td.today.disabled:hover.active { 178 | background-color: #fbf069 \9; 179 | } 180 | .datepicker table tr td.today:hover:hover { 181 | color: #000; 182 | } 183 | .datepicker table tr td.today.active:hover { 184 | color: #fff; 185 | } 186 | .datepicker table tr td.range, 187 | .datepicker table tr td.range:hover, 188 | .datepicker table tr td.range.disabled, 189 | .datepicker table tr td.range.disabled:hover { 190 | background: #eeeeee; 191 | -webkit-border-radius: 0; 192 | -moz-border-radius: 0; 193 | border-radius: 0; 194 | } 195 | .datepicker table tr td.range.today, 196 | .datepicker table tr td.range.today:hover, 197 | .datepicker table tr td.range.today.disabled, 198 | .datepicker table tr td.range.today.disabled:hover { 199 | background-color: #f3d17a; 200 | background-image: -moz-linear-gradient(top, #f3c17a, #f3e97a); 201 | background-image: -ms-linear-gradient(top, #f3c17a, #f3e97a); 202 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a)); 203 | background-image: -webkit-linear-gradient(top, #f3c17a, #f3e97a); 204 | background-image: -o-linear-gradient(top, #f3c17a, #f3e97a); 205 | background-image: linear-gradient(top, #f3c17a, #f3e97a); 206 | background-repeat: repeat-x; 207 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0); 208 | border-color: #f3e97a #f3e97a #edde34; 209 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 210 | filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); 211 | -webkit-border-radius: 0; 212 | -moz-border-radius: 0; 213 | border-radius: 0; 214 | } 215 | .datepicker table tr td.range.today:hover, 216 | .datepicker table tr td.range.today:hover:hover, 217 | .datepicker table tr td.range.today.disabled:hover, 218 | .datepicker table tr td.range.today.disabled:hover:hover, 219 | .datepicker table tr td.range.today:active, 220 | .datepicker table tr td.range.today:hover:active, 221 | .datepicker table tr td.range.today.disabled:active, 222 | .datepicker table tr td.range.today.disabled:hover:active, 223 | .datepicker table tr td.range.today.active, 224 | .datepicker table tr td.range.today:hover.active, 225 | .datepicker table tr td.range.today.disabled.active, 226 | .datepicker table tr td.range.today.disabled:hover.active, 227 | .datepicker table tr td.range.today.disabled, 228 | .datepicker table tr td.range.today:hover.disabled, 229 | .datepicker table tr td.range.today.disabled.disabled, 230 | .datepicker table tr td.range.today.disabled:hover.disabled, 231 | .datepicker table tr td.range.today[disabled], 232 | .datepicker table tr td.range.today:hover[disabled], 233 | .datepicker table tr td.range.today.disabled[disabled], 234 | .datepicker table tr td.range.today.disabled:hover[disabled] { 235 | background-color: #f3e97a; 236 | } 237 | .datepicker table tr td.range.today:active, 238 | .datepicker table tr td.range.today:hover:active, 239 | .datepicker table tr td.range.today.disabled:active, 240 | .datepicker table tr td.range.today.disabled:hover:active, 241 | .datepicker table tr td.range.today.active, 242 | .datepicker table tr td.range.today:hover.active, 243 | .datepicker table tr td.range.today.disabled.active, 244 | .datepicker table tr td.range.today.disabled:hover.active { 245 | background-color: #efe24b \9; 246 | } 247 | .datepicker table tr td.selected, 248 | .datepicker table tr td.selected:hover, 249 | .datepicker table tr td.selected.disabled, 250 | .datepicker table tr td.selected.disabled:hover { 251 | background-color: #9e9e9e; 252 | background-image: -moz-linear-gradient(top, #b3b3b3, #808080); 253 | background-image: -ms-linear-gradient(top, #b3b3b3, #808080); 254 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(#808080)); 255 | background-image: -webkit-linear-gradient(top, #b3b3b3, #808080); 256 | background-image: -o-linear-gradient(top, #b3b3b3, #808080); 257 | background-image: linear-gradient(top, #b3b3b3, #808080); 258 | background-repeat: repeat-x; 259 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0); 260 | border-color: #808080 #808080 #595959; 261 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 262 | filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); 263 | color: #fff; 264 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 265 | } 266 | .datepicker table tr td.selected:hover, 267 | .datepicker table tr td.selected:hover:hover, 268 | .datepicker table tr td.selected.disabled:hover, 269 | .datepicker table tr td.selected.disabled:hover:hover, 270 | .datepicker table tr td.selected:active, 271 | .datepicker table tr td.selected:hover:active, 272 | .datepicker table tr td.selected.disabled:active, 273 | .datepicker table tr td.selected.disabled:hover:active, 274 | .datepicker table tr td.selected.active, 275 | .datepicker table tr td.selected:hover.active, 276 | .datepicker table tr td.selected.disabled.active, 277 | .datepicker table tr td.selected.disabled:hover.active, 278 | .datepicker table tr td.selected.disabled, 279 | .datepicker table tr td.selected:hover.disabled, 280 | .datepicker table tr td.selected.disabled.disabled, 281 | .datepicker table tr td.selected.disabled:hover.disabled, 282 | .datepicker table tr td.selected[disabled], 283 | .datepicker table tr td.selected:hover[disabled], 284 | .datepicker table tr td.selected.disabled[disabled], 285 | .datepicker table tr td.selected.disabled:hover[disabled] { 286 | background-color: #808080; 287 | } 288 | .datepicker table tr td.selected:active, 289 | .datepicker table tr td.selected:hover:active, 290 | .datepicker table tr td.selected.disabled:active, 291 | .datepicker table tr td.selected.disabled:hover:active, 292 | .datepicker table tr td.selected.active, 293 | .datepicker table tr td.selected:hover.active, 294 | .datepicker table tr td.selected.disabled.active, 295 | .datepicker table tr td.selected.disabled:hover.active { 296 | background-color: #666666 \9; 297 | } 298 | .datepicker table tr td.active, 299 | .datepicker table tr td.active:hover, 300 | .datepicker table tr td.active.disabled, 301 | .datepicker table tr td.active.disabled:hover { 302 | background-color: #006dcc; 303 | background-image: -moz-linear-gradient(top, #0088cc, #0044cc); 304 | background-image: -ms-linear-gradient(top, #0088cc, #0044cc); 305 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); 306 | background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); 307 | background-image: -o-linear-gradient(top, #0088cc, #0044cc); 308 | background-image: linear-gradient(top, #0088cc, #0044cc); 309 | background-repeat: repeat-x; 310 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); 311 | border-color: #0044cc #0044cc #002a80; 312 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 313 | filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); 314 | color: #fff; 315 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 316 | } 317 | .datepicker table tr td.active:hover, 318 | .datepicker table tr td.active:hover:hover, 319 | .datepicker table tr td.active.disabled:hover, 320 | .datepicker table tr td.active.disabled:hover:hover, 321 | .datepicker table tr td.active:active, 322 | .datepicker table tr td.active:hover:active, 323 | .datepicker table tr td.active.disabled:active, 324 | .datepicker table tr td.active.disabled:hover:active, 325 | .datepicker table tr td.active.active, 326 | .datepicker table tr td.active:hover.active, 327 | .datepicker table tr td.active.disabled.active, 328 | .datepicker table tr td.active.disabled:hover.active, 329 | .datepicker table tr td.active.disabled, 330 | .datepicker table tr td.active:hover.disabled, 331 | .datepicker table tr td.active.disabled.disabled, 332 | .datepicker table tr td.active.disabled:hover.disabled, 333 | .datepicker table tr td.active[disabled], 334 | .datepicker table tr td.active:hover[disabled], 335 | .datepicker table tr td.active.disabled[disabled], 336 | .datepicker table tr td.active.disabled:hover[disabled] { 337 | background-color: #0044cc; 338 | } 339 | .datepicker table tr td.active:active, 340 | .datepicker table tr td.active:hover:active, 341 | .datepicker table tr td.active.disabled:active, 342 | .datepicker table tr td.active.disabled:hover:active, 343 | .datepicker table tr td.active.active, 344 | .datepicker table tr td.active:hover.active, 345 | .datepicker table tr td.active.disabled.active, 346 | .datepicker table tr td.active.disabled:hover.active { 347 | background-color: #003399 \9; 348 | } 349 | .datepicker table tr td span { 350 | display: block; 351 | width: 23%; 352 | height: 54px; 353 | line-height: 54px; 354 | float: left; 355 | margin: 1%; 356 | cursor: pointer; 357 | -webkit-border-radius: 4px; 358 | -moz-border-radius: 4px; 359 | border-radius: 4px; 360 | } 361 | .datepicker table tr td span:hover { 362 | background: #eeeeee; 363 | } 364 | .datepicker table tr td span.disabled, 365 | .datepicker table tr td span.disabled:hover { 366 | background: none; 367 | color: #999999; 368 | cursor: default; 369 | } 370 | .datepicker table tr td span.active, 371 | .datepicker table tr td span.active:hover, 372 | .datepicker table tr td span.active.disabled, 373 | .datepicker table tr td span.active.disabled:hover { 374 | background-color: #006dcc; 375 | background-image: -moz-linear-gradient(top, #0088cc, #0044cc); 376 | background-image: -ms-linear-gradient(top, #0088cc, #0044cc); 377 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); 378 | background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); 379 | background-image: -o-linear-gradient(top, #0088cc, #0044cc); 380 | background-image: linear-gradient(top, #0088cc, #0044cc); 381 | background-repeat: repeat-x; 382 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); 383 | border-color: #0044cc #0044cc #002a80; 384 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 385 | filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); 386 | color: #fff; 387 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 388 | } 389 | .datepicker table tr td span.active:hover, 390 | .datepicker table tr td span.active:hover:hover, 391 | .datepicker table tr td span.active.disabled:hover, 392 | .datepicker table tr td span.active.disabled:hover:hover, 393 | .datepicker table tr td span.active:active, 394 | .datepicker table tr td span.active:hover:active, 395 | .datepicker table tr td span.active.disabled:active, 396 | .datepicker table tr td span.active.disabled:hover:active, 397 | .datepicker table tr td span.active.active, 398 | .datepicker table tr td span.active:hover.active, 399 | .datepicker table tr td span.active.disabled.active, 400 | .datepicker table tr td span.active.disabled:hover.active, 401 | .datepicker table tr td span.active.disabled, 402 | .datepicker table tr td span.active:hover.disabled, 403 | .datepicker table tr td span.active.disabled.disabled, 404 | .datepicker table tr td span.active.disabled:hover.disabled, 405 | .datepicker table tr td span.active[disabled], 406 | .datepicker table tr td span.active:hover[disabled], 407 | .datepicker table tr td span.active.disabled[disabled], 408 | .datepicker table tr td span.active.disabled:hover[disabled] { 409 | background-color: #0044cc; 410 | } 411 | .datepicker table tr td span.active:active, 412 | .datepicker table tr td span.active:hover:active, 413 | .datepicker table tr td span.active.disabled:active, 414 | .datepicker table tr td span.active.disabled:hover:active, 415 | .datepicker table tr td span.active.active, 416 | .datepicker table tr td span.active:hover.active, 417 | .datepicker table tr td span.active.disabled.active, 418 | .datepicker table tr td span.active.disabled:hover.active { 419 | background-color: #003399 \9; 420 | } 421 | .datepicker table tr td span.old, 422 | .datepicker table tr td span.new { 423 | color: #999999; 424 | } 425 | .datepicker th.datepicker-switch { 426 | width: 145px; 427 | } 428 | .datepicker thead tr:first-child th, 429 | .datepicker tfoot tr th { 430 | cursor: pointer; 431 | } 432 | .datepicker thead tr:first-child th:hover, 433 | .datepicker tfoot tr th:hover { 434 | background: #eeeeee; 435 | } 436 | .datepicker .cw { 437 | font-size: 10px; 438 | width: 12px; 439 | padding: 0 2px 0 5px; 440 | vertical-align: middle; 441 | } 442 | .datepicker thead tr:first-child th.cw { 443 | cursor: default; 444 | background-color: transparent; 445 | } 446 | .input-append.date .add-on i, 447 | .input-prepend.date .add-on i { 448 | cursor: pointer; 449 | width: 16px; 450 | height: 16px; 451 | } 452 | .input-daterange input { 453 | text-align: center; 454 | } 455 | .input-daterange input:first-child { 456 | -webkit-border-radius: 3px 0 0 3px; 457 | -moz-border-radius: 3px 0 0 3px; 458 | border-radius: 3px 0 0 3px; 459 | } 460 | .input-daterange input:last-child { 461 | -webkit-border-radius: 0 3px 3px 0; 462 | -moz-border-radius: 0 3px 3px 0; 463 | border-radius: 0 3px 3px 0; 464 | } 465 | .input-daterange .add-on { 466 | display: inline-block; 467 | width: auto; 468 | min-width: 16px; 469 | height: 20px; 470 | padding: 4px 5px; 471 | font-weight: normal; 472 | line-height: 20px; 473 | text-align: center; 474 | text-shadow: 0 1px 0 #ffffff; 475 | vertical-align: middle; 476 | background-color: #eeeeee; 477 | border: 1px solid #ccc; 478 | margin-left: -5px; 479 | margin-right: -5px; 480 | } 481 | .datepicker.dropdown-menu { 482 | position: absolute; 483 | top: 100%; 484 | left: 0; 485 | z-index: 1000; 486 | float: left; 487 | display: none; 488 | min-width: 160px; 489 | list-style: none; 490 | background-color: #ffffff; 491 | border: 1px solid #ccc; 492 | border: 1px solid rgba(0, 0, 0, 0.2); 493 | -webkit-border-radius: 5px; 494 | -moz-border-radius: 5px; 495 | border-radius: 5px; 496 | -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); 497 | -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); 498 | box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); 499 | -webkit-background-clip: padding-box; 500 | -moz-background-clip: padding; 501 | background-clip: padding-box; 502 | *border-right-width: 2px; 503 | *border-bottom-width: 2px; 504 | color: #333333; 505 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 506 | font-size: 13px; 507 | line-height: 20px; 508 | } 509 | .datepicker.dropdown-menu th, 510 | .datepicker.datepicker-inline th, 511 | .datepicker.dropdown-menu td, 512 | .datepicker.datepicker-inline td { 513 | padding: 4px 5px; 514 | } 515 | -------------------------------------------------------------------------------- /public/css/style.css: -------------------------------------------------------------------------------- 1 | html, body, div, span, applet, object, iframe, 2 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 3 | a, abbr, acronym, address, big, cite, code, 4 | del, dfn, em, img, ins, kbd, q, s, samp, 5 | small, strike, strong, sub, sup, tt, var, 6 | b, u, i, center, 7 | dl, dt, dd, ol, ul, li, 8 | fieldset, form, label, legend, 9 | table, caption, tbody, tfoot, thead, tr, th, td, 10 | article, aside, canvas, details, embed, 11 | figure, figcaption, footer, header, hgroup, 12 | menu, nav, output, ruby, section, summary, 13 | time, mark, audio, video { 14 | margin: 0; 15 | padding: 0; 16 | border: 0; 17 | font-size: 100%; 18 | font: inherit; 19 | vertical-align: baseline; 20 | } 21 | 22 | article, aside, details, figcaption, figure, 23 | footer, header, hgroup, menu, nav, section { 24 | display: block; 25 | } 26 | 27 | body { 28 | line-height: 1; 29 | } 30 | 31 | ol, ul { 32 | list-style: none; 33 | } 34 | 35 | blockquote, q { 36 | quotes: none; 37 | } 38 | 39 | blockquote:before, blockquote:after, 40 | q:before, q:after { 41 | content: ''; 42 | content: none; 43 | } 44 | 45 | table { 46 | border-collapse: collapse; 47 | border-spacing: 0; 48 | } 49 | 50 | .about { 51 | margin: 70px auto 40px; 52 | padding: 8px; 53 | width: 260px; 54 | font: 10px/18px 'Lucida Grande', Arial, sans-serif; 55 | color: #666; 56 | text-align: center; 57 | text-shadow: 0 1px rgba(255, 255, 255, 0.25); 58 | background: #eee; 59 | background: rgba(250, 250, 250, 0.8); 60 | border-radius: 4px; 61 | background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.1)); 62 | background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.1)); 63 | background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.1)); 64 | background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.1)); 65 | -webkit-box-shadow: inset 0 1px rgba(255, 255, 255, 0.3), inset 0 0 0 1px rgba(255, 255, 255, 0.1), 0 0 6px rgba(0, 0, 0, 0.2); 66 | box-shadow: inset 0 1px rgba(255, 255, 255, 0.3), inset 0 0 0 1px rgba(255, 255, 255, 0.1), 0 0 6px rgba(0, 0, 0, 0.2); 67 | } 68 | .about a { 69 | color: #333; 70 | text-decoration: none; 71 | border-radius: 2px; 72 | -webkit-transition: background 0.1s; 73 | -moz-transition: background 0.1s; 74 | -o-transition: background 0.1s; 75 | transition: background 0.1s; 76 | } 77 | .about a:hover { 78 | text-decoration: none; 79 | background: #fafafa; 80 | background: rgba(255, 255, 255, 0.7); 81 | } 82 | 83 | .about-links { 84 | height: 30px; 85 | } 86 | .about-links > a { 87 | float: left; 88 | width: 50%; 89 | line-height: 30px; 90 | font-size: 12px; 91 | } 92 | 93 | .about-author { 94 | margin-top: 5px; 95 | } 96 | .about-author > a { 97 | padding: 1px 3px; 98 | margin: 0 -1px; 99 | } 100 | 101 | /* 102 | * Copyright (c) 2013 Thibaut Courouble 103 | * http://www.cssflow.com 104 | * 105 | * Licensed under the MIT License: 106 | * http://www.opensource.org/licenses/mit-license.php 107 | */ 108 | body { 109 | font: 13px/20px 'Helvetica Neue', Helvetica, Arial, sans-serif; 110 | color: #404040; 111 | background: #596778; 112 | } 113 | 114 | .sign-up { 115 | position: relative; 116 | margin: 50px auto; 117 | width: 280px; 118 | padding: 33px 25px 29px; 119 | background: white; 120 | border-radius: 5px; 121 | } 122 | .sign-up:before, .sign-up:after { 123 | content: ''; 124 | position: absolute; 125 | bottom: 1px; 126 | left: 0; 127 | right: 0; 128 | height: 10px; 129 | background: inherit; 130 | border-bottom: 1px solid #d2d2d2; 131 | border-radius: 4px; 132 | } 133 | .sign-up:after { 134 | bottom: 3px; 135 | border-color: #dcdcdc; 136 | } 137 | 138 | .sign-up-title { 139 | margin: -25px -25px 25px; 140 | padding: 15px 25px; 141 | line-height: 35px; 142 | font-size: 26px; 143 | font-weight: 300; 144 | color: #aaa; 145 | text-align: center; 146 | text-shadow: 0 1px rgba(255, 255, 255, 0.75); 147 | background: #f7f7f7; 148 | } 149 | .sign-up-title:before { 150 | content: ''; 151 | position: absolute; 152 | top: 0; 153 | left: 0; 154 | right: 0; 155 | height: 8px; 156 | background: #c4e17f; 157 | border-radius: 5px 5px 0 0; 158 | background-image: -webkit-linear-gradient(left, #c4e17f, #c4e17f 12.5%, #f7fdca 12.5%, #f7fdca 25%, #fecf71 25%, #fecf71 37.5%, #f0776c 37.5%, #f0776c 50%, #db9dbe 50%, #db9dbe 62.5%, #c49cde 62.5%, #c49cde 75%, #669ae1 75%, #669ae1 87.5%, #62c2e4 87.5%, #62c2e4); 159 | background-image: -moz-linear-gradient(left, #c4e17f, #c4e17f 12.5%, #f7fdca 12.5%, #f7fdca 25%, #fecf71 25%, #fecf71 37.5%, #f0776c 37.5%, #f0776c 50%, #db9dbe 50%, #db9dbe 62.5%, #c49cde 62.5%, #c49cde 75%, #669ae1 75%, #669ae1 87.5%, #62c2e4 87.5%, #62c2e4); 160 | background-image: -o-linear-gradient(left, #c4e17f, #c4e17f 12.5%, #f7fdca 12.5%, #f7fdca 25%, #fecf71 25%, #fecf71 37.5%, #f0776c 37.5%, #f0776c 50%, #db9dbe 50%, #db9dbe 62.5%, #c49cde 62.5%, #c49cde 75%, #669ae1 75%, #669ae1 87.5%, #62c2e4 87.5%, #62c2e4); 161 | background-image: linear-gradient(to right, #c4e17f, #c4e17f 12.5%, #f7fdca 12.5%, #f7fdca 25%, #fecf71 25%, #fecf71 37.5%, #f0776c 37.5%, #f0776c 50%, #db9dbe 50%, #db9dbe 62.5%, #c49cde 62.5%, #c49cde 75%, #669ae1 75%, #669ae1 87.5%, #62c2e4 87.5%, #62c2e4); 162 | } 163 | 164 | input { 165 | font-family: inherit; 166 | color: inherit; 167 | -webkit-box-sizing: border-box; 168 | -moz-box-sizing: border-box; 169 | box-sizing: border-box; 170 | } 171 | 172 | input, 173 | button { 174 | appearance: none; 175 | -moz-appearance: none; 176 | -webkit-appearance: none; 177 | } 178 | 179 | .sign-up-input { 180 | width: 100%; 181 | height: 50px; 182 | margin-bottom: 25px; 183 | padding: 0 15px 2px; 184 | font-size: 17px; 185 | background: white; 186 | border: 2px solid #ebebeb; 187 | border-radius: 4px; 188 | -webkit-box-shadow: inset 0 -2px #ebebeb; 189 | box-shadow: inset 0 -2px #ebebeb; 190 | } 191 | .sign-up-input:focus { 192 | border-color: #62c2e4; 193 | outline: none; 194 | -webkit-box-shadow: inset 0 -2px #62c2e4; 195 | box-shadow: inset 0 -2px #62c2e4; 196 | } 197 | .lt-ie9 .sign-up-input { 198 | line-height: 48px; 199 | } 200 | 201 | .sign-up-button { 202 | width: 100%; 203 | height: 54px; 204 | padding: 0; 205 | font-size: 22px; 206 | color: white; 207 | text-align: center; 208 | background: #f0776c; 209 | border-radius: 5px; 210 | border:none; 211 | cursor: pointer; 212 | } 213 | 214 | 215 | 216 | -------------------------------------------------------------------------------- /public/css/styles.css: -------------------------------------------------------------------------------- 1 | /* 2 | Lumino Admin Bootstrap Template 3 | Version 1.0 4 | */ 5 | 6 | 7 | /*Global Styles*/ 8 | 9 | body { 10 | background: #f1f4f7; 11 | padding-top: 50px; 12 | color: #5f6468; 13 | } 14 | 15 | p { 16 | color: #777; 17 | } 18 | 19 | a, a:hover, a:focus { 20 | color: #30a5ff; 21 | } 22 | 23 | h1, h2, h3, h4, h5, h6 { 24 | color: #5f6468; 25 | } 26 | 27 | h1 { 28 | font-weight: 300; 29 | font-size: 40px; 30 | } 31 | 32 | h2 { 33 | font-weight: 300; 34 | margin-bottom: 20px; 35 | } 36 | 37 | h3, h4 { 38 | font-weight: 300; 39 | } 40 | 41 | .large { 42 | font-size: 2em; 43 | } 44 | 45 | .text-muted { 46 | color: #9fadbb; 47 | } 48 | 49 | .color-gray { color: #5f6468; } 50 | .color-blue { color: #30a5ff; } 51 | .color-teal { color: #1ebfae; } 52 | .color-orange { color: #ffb53e; } 53 | .color-red { color: #f9243f; } 54 | 55 | .bg-primary .glyphicon-remove { color: #5f6468;} 56 | .bg-primary .glyphicon-remove:hover { color: #ef4040;} 57 | 58 | .no-padding { 59 | padding: 0; margin: 0; 60 | } 61 | 62 | .glyphicon-xl { 63 | font-size: 6em; 64 | } 65 | 66 | .glyphicon-l { 67 | font-size: 3em; 68 | } 69 | 70 | .glyphicon-m { 71 | font-size: 1.5em; 72 | } 73 | 74 | .glyphicon-s { 75 | font-size: 0.75em; 76 | } 77 | 78 | .form-control { 79 | border: 1px solid #eee; 80 | box-shadow: none; 81 | } 82 | 83 | .form-control:focus { 84 | border: 1px solid #30a5ff; 85 | outline: 0; 86 | box-shadow: inset 0px 0px 0px 1px #30a5ff; 87 | } 88 | 89 | .navbar-header .navbar-brand { 90 | color: #fff; 91 | font-size: 16px; 92 | text-transform: uppercase; 93 | font-weight: 500; 94 | letter-spacing: 2px; 95 | } 96 | 97 | .navbar-header .navbar-brand span { 98 | color: #30a5ff; 99 | } 100 | 101 | /*Buttons*/ 102 | 103 | a.btn:hover, 104 | button:hover { 105 | opacity: 0.8; 106 | } 107 | 108 | a.btn:active, 109 | button:active { 110 | box-shadow: inset 0px 0px 500px rgba(0,0,0,.1); 111 | opacity: 1; 112 | } 113 | 114 | .btn-default, 115 | .btn-default:hover, 116 | .btn-default:focus, 117 | .btn-default:active, 118 | .btn-default.active, 119 | .open > .dropdown-toggle.btn-default, 120 | .btn-default.disabled, 121 | .btn-default[disabled], 122 | fieldset[disabled] .btn-default, 123 | .btn-default.disabled:hover, 124 | .btn-default[disabled]:hover, 125 | fieldset[disabled] .btn-default:hover, 126 | .btn-default.disabled:focus, 127 | .btn-default[disabled]:focus, 128 | fieldset[disabled] .btn-default:focus, 129 | .btn-default.disabled:active, 130 | .btn-default[disabled]:active, 131 | fieldset[disabled] .btn-default:active, 132 | .btn-default.disabled.active, 133 | .btn-default[disabled].active, 134 | fieldset[disabled] .btn-default.active { 135 | background-color: #e9ecf2; 136 | border-color: #e9ecf2; 137 | color: #1b3548; 138 | } 139 | 140 | .btn-primary, 141 | .btn-primary:hover, 142 | .btn-primary:focus, 143 | .btn-primary:active, 144 | .btn-primary.active, 145 | .open > .dropdown-toggle.btn-primary, 146 | .btn-primary.disabled, 147 | .btn-primary[disabled], 148 | fieldset[disabled] .btn-primary, 149 | .btn-primary.disabled:hover, 150 | .btn-primary[disabled]:hover, 151 | fieldset[disabled] .btn-primary:hover, 152 | .btn-primary.disabled:focus, 153 | .btn-primary[disabled]:focus, 154 | fieldset[disabled] .btn-primary:focus, 155 | .btn-primary.disabled:active, 156 | .btn-primary[disabled]:active, 157 | fieldset[disabled] .btn-primary:active, 158 | .btn-primary.disabled.active, 159 | .btn-primary[disabled].active, 160 | fieldset[disabled] .btn-primary.active { 161 | background-color: #30a5ff; 162 | border-color: #30a5ff; 163 | } 164 | 165 | .btn-success, 166 | .btn-success:hover, 167 | .btn-success:focus, 168 | .btn-success:active, 169 | .btn-success.active, 170 | .open > .dropdown-toggle.btn-success, 171 | .btn-success.disabled, 172 | .btn-success[disabled], 173 | fieldset[disabled] .btn-success, 174 | .btn-success.disabled:hover, 175 | .btn-success[disabled]:hover, 176 | fieldset[disabled] .btn-success:hover, 177 | .btn-success.disabled:focus, 178 | .btn-success[disabled]:focus, 179 | fieldset[disabled] .btn-success:focus, 180 | .btn-success.disabled:active, 181 | .btn-success[disabled]:active, 182 | fieldset[disabled] .btn-success:active, 183 | .btn-success.disabled.active, 184 | .btn-success[disabled].active, 185 | fieldset[disabled] .btn-success.active { 186 | background-color: #8ad919; 187 | border-color: #8ad919; 188 | } 189 | 190 | .btn-warning, 191 | .btn-warning:hover, 192 | .btn-warning:focus, 193 | .btn-warning:active, 194 | .btn-warning.active, 195 | .open > .dropdown-toggle.btn-warning, 196 | .btn-warning.disabled, 197 | .btn-warning[disabled], 198 | fieldset[disabled] .btn-warning, 199 | .btn-warning.disabled:hover, 200 | .btn-warning[disabled]:hover, 201 | fieldset[disabled] .btn-warning:hover, 202 | .btn-warning.disabled:focus, 203 | .btn-warning[disabled]:focus, 204 | fieldset[disabled] .btn-warning:focus, 205 | .btn-warning.disabled:active, 206 | .btn-warning[disabled]:active, 207 | fieldset[disabled] .btn-warning:active, 208 | .btn-warning.disabled.active, 209 | .btn-warning[disabled].active, 210 | fieldset[disabled] .btn-warning.active { 211 | background-color: #ffb53e; 212 | border-color: #ffb53e; 213 | } 214 | 215 | .btn-danger, 216 | .btn-danger:hover, 217 | .btn-danger:focus, 218 | .btn-danger:active, 219 | .btn-danger.active, 220 | .open > .dropdown-toggle.btn-danger, 221 | .btn-danger.disabled, 222 | .btn-danger[disabled], 223 | fieldset[disabled] .btn-danger, 224 | .btn-danger.disabled:hover, 225 | .btn-danger[disabled]:hover, 226 | fieldset[disabled] .btn-danger:hover, 227 | .btn-danger.disabled:focus, 228 | .btn-danger[disabled]:focus, 229 | fieldset[disabled] .btn-danger:focus, 230 | .btn-danger.disabled:active, 231 | .btn-danger[disabled]:active, 232 | fieldset[disabled] .btn-danger:active, 233 | .btn-danger.disabled.active, 234 | .btn-danger[disabled].active, 235 | fieldset[disabled] .btn-danger.active { 236 | background-color: #f9243f; 237 | border-color: #f9243f; 238 | } 239 | 240 | /*Backgrounds*/ 241 | 242 | .bg-primary { 243 | color: #1b3548; 244 | background-color: #e9ecf2; 245 | } 246 | a.bg-primary:hover { 247 | background-color: #e9ecf2; 248 | } 249 | .bg-success { 250 | color: #fff; 251 | background-color: #8ad919; 252 | } 253 | a.bg-success:hover { 254 | background-color: #8ad919; 255 | } 256 | .bg-success a { 257 | color: rgba(255, 255, 255, .75); 258 | } 259 | .bg-info { 260 | color: #fff; 261 | background-color: #30a5ff; 262 | } 263 | a.bg-info:hover { 264 | background-color: #30a5ff; 265 | } 266 | .bg-info a { 267 | color: rgba(255, 255, 255, .75); 268 | } 269 | .bg-warning { 270 | color: #fff; 271 | background-color: #ffb53e; 272 | } 273 | a.bg-warning:hover { 274 | background-color: #ffb53e; 275 | } 276 | .bg-warning a { 277 | color: rgba(255, 255, 255, .75); 278 | } 279 | .bg-danger { 280 | color: #fff; 281 | background-color: #f9243f; 282 | } 283 | a.bg-danger:hover { 284 | background-color: #f9243f; 285 | } 286 | .bg-danger a { 287 | color: rgba(255, 255, 255, .75); 288 | } 289 | 290 | /*Panels*/ 291 | 292 | .panel { 293 | border: 0; 294 | } 295 | 296 | .panel-heading { 297 | font-size: 18px; 298 | font-weight: 300; 299 | letter-spacing: 0.025em; 300 | height: 66px; 301 | line-height: 45px; 302 | } 303 | 304 | .panel-default .panel-heading { 305 | background: #fff; 306 | border-bottom: 1px solid #eee; 307 | color: #5f6468; 308 | } 309 | 310 | .panel-footer { 311 | background: #fff; 312 | border-top: 1px solid #eee; 313 | } 314 | 315 | .panel-widget { 316 | padding: 0; 317 | position: relative; 318 | } 319 | 320 | .panel-widget .panel-footer { 321 | border: 0; 322 | text-align: center; 323 | } 324 | 325 | .panel-footer .input-group { 326 | padding: 0px; 327 | margin: 0 -5px; 328 | } 329 | 330 | .panel-footer .input-group-btn:last-child>.btn, 331 | .panel-footer .input-group-btn:last-child>.btn-group { 332 | margin: 0; 333 | } 334 | 335 | .panel-widget .panel-footer a { 336 | color: #999; 337 | } 338 | 339 | .panel-widget .panel-footer a:hover { 340 | color: #666; 341 | text-decoration: none; 342 | } 343 | 344 | .panel-blue { background: #30a5ff; color: #fff; } 345 | .panel-teal { background: #1ebfae; color: #fff; } 346 | .panel-orange { background: #ffb53e; color: #fff; } 347 | .panel-red { background: #f9243f; color: #fff; } 348 | 349 | .panel-blue .panel-body p, 350 | .panel-teal .panel-body p, 351 | .panel-orange .panel-body p, 352 | .panel-red .panel-body p { 353 | color: #fff; 354 | color: rgba(255, 255, 255, .8); 355 | } 356 | 357 | .panel-blue .panel-heading, 358 | .panel-teal .panel-heading, 359 | .panel-orange .panel-heading, 360 | .panel-red .panel-heading { 361 | border-bottom: 1px solid rgba(255, 255, 255, .2); 362 | } 363 | 364 | .panel-blue .text-muted, 365 | .panel-teal .text-muted, 366 | .panel-orange .text-muted, 367 | .panel-red .text-muted { 368 | color: rgba(255, 255, 255, .5); 369 | } 370 | 371 | .dark-overlay { 372 | background: rgba(0, 0, 0, .05); 373 | text-align: center; 374 | } 375 | 376 | .widget-left { 377 | height: 80px; 378 | padding-top: 15px; 379 | text-align: center; 380 | border-top-left-radius: 4px; 381 | border-bottom-left-radius: 4px; 382 | } 383 | 384 | .widget-right { 385 | text-align: left; 386 | line-height: 1.6em; 387 | margin: 0px; 388 | padding: 20px; 389 | height: 80px; 390 | color: #999; 391 | font-weight: 300; 392 | background: #fff; 393 | border-top-right-radius: 4px; 394 | border-bottom-right-radius: 4px; 395 | } 396 | 397 | @media (max-width: 768px) { 398 | .widget-right { 399 | width: 100%; 400 | margin: 0; 401 | text-align: center; 402 | border-top-left-radius: 0px; 403 | border-top-right-radius: 0px; 404 | border-bottom-left-radius: 4px; 405 | border-bottom-right-radius: 4px; 406 | } 407 | } 408 | 409 | @media (max-width: 768px) { 410 | .widget-left { 411 | border-top-left-radius: 4px; 412 | border-top-right-radius: 4px; 413 | border-bottom-left-radius: 0px; 414 | border-bottom-right-radius: 0px; 415 | } 416 | } 417 | 418 | .widget-right .text-muted { 419 | color: #9fadbb; 420 | } 421 | .widget-right .large { 422 | color: #5f6468; 423 | } 424 | 425 | .panel-blue .widget-left { background: #30a5ff; color: #fff; } 426 | .panel-teal .widget-left { background: #1ebfae; color: #fff; } 427 | .panel-orange .widget-left { background: #ffb53e; color: #fff; } 428 | .panel-red .widget-left { background: #f9243f; color: #fff; } 429 | 430 | .panel-widget { 431 | background: #fff; 432 | } 433 | 434 | /*Jumbotron*/ 435 | 436 | .jumbotron { 437 | background: #fff; 438 | border-bottom: 1px solid #eee; 439 | color: #5f6468; 440 | } 441 | 442 | /*Tabs*/ 443 | 444 | .panel .tabs { 445 | margin: 0; 446 | padding: 0; 447 | } 448 | 449 | .nav-tabs { 450 | background: #e9ecf2; 451 | border: 0; 452 | } 453 | 454 | .nav-tabs li a:hover { 455 | background: #fff; 456 | } 457 | 458 | .nav-tabs li a, 459 | .nav-tabs li a:hover, 460 | .nav-tabs li.active a, 461 | .nav-tabs li.active a:hover { 462 | border: 0; 463 | padding: 15px 20px; 464 | } 465 | 466 | .nav-pills { 467 | padding: 15px; 468 | padding-bottom: 0; 469 | } 470 | 471 | .nav-pills li a, 472 | .nav-pills li a:hover, 473 | .nav-pills li.active a, 474 | .nav-pills li.active a:hover { 475 | border: 0; 476 | padding: 7px 15px; 477 | } 478 | 479 | .nav-pills li.active a, 480 | .nav-pills li.active a:hover { 481 | background: #30a5ff; 482 | } 483 | 484 | .tab-content { 485 | padding: 15px; 486 | } 487 | 488 | 489 | /*Navbar*/ 490 | 491 | .navbar { 492 | border: 0; 493 | } 494 | 495 | .navbar input { 496 | border: 0; 497 | background: #444; 498 | color: #fff; 499 | } 500 | 501 | .navbar input:focus { 502 | color: #fff; 503 | background: #555; 504 | border: 1px solid #30a5ff; 505 | outline: 0; 506 | box-shadow: inset 0px 0px 0px 1px #30a5ff; 507 | } 508 | 509 | .user-menu { 510 | display: inline-block; 511 | margin-top: 14px; 512 | margin-right: 10px; 513 | float: right; 514 | list-style: none; 515 | padding: 0; 516 | } 517 | 518 | .user-menu a { 519 | color: #fff; 520 | } 521 | 522 | .user-menu a:hover, .user-menu a:focus { 523 | text-decoration: none; 524 | } 525 | 526 | /* Sidebar */ 527 | 528 | .sidebar { 529 | display: block; 530 | background-color: #fff; 531 | padding: 0; 532 | display: none; 533 | } 534 | 535 | .sidebar form { 536 | padding: 20px 15px 5px 15px; 537 | border-bottom: 1px solid #eee; 538 | margin-bottom: 20px; 539 | } 540 | 541 | @media (min-width: 768px) { 542 | .sidebar { 543 | display: block; 544 | position: fixed; 545 | top: 50px; 546 | bottom: 0; 547 | left: 0; 548 | z-index: 1000; 549 | display: block; 550 | margin: 0; 551 | padding: 0; 552 | overflow-x: hidden; 553 | overflow-y: auto; 554 | background-color: #fff; 555 | box-shadow: 1px 0px 10px rgba(0, 0, 0, .05); 556 | } 557 | .navbar-header { 558 | width: 100%; 559 | } 560 | } 561 | 562 | .sidebar ul.nav a:hover, 563 | .sidebar ul.nav li.parent ul li a:hover { 564 | text-decoration: none; 565 | background-color: #e9ecf2; 566 | } 567 | 568 | .sidebar ul.nav .active a, .sidebar ul.nav li.parent a.active, 569 | .sidebar ul.nav .active > a:hover, .sidebar ul.nav li.parent a.active:hover, 570 | .sidebar ul.nav .active > a:focus, .sidebar ul.nav li.parent a.active:focus { 571 | color: #fff; 572 | background-color: #30a5ff; 573 | }*/ 574 | 575 | .sidebar ul.nav ul, 576 | .sidebar ul.nav ul li { 577 | list-style: none; 578 | list-style-type: none; 579 | } 580 | 581 | .sidebar ul.nav ul.children { 582 | width: auto; 583 | padding: 0; 584 | margin: 0; 585 | background: #f9f9f9; 586 | } 587 | 588 | .sidebar ul.nav ul.children li a { 589 | height: 40px; 590 | background: #f9f9f9; 591 | color: #30a5ff!important; 592 | } 593 | 594 | .sidebar ul.nav li.current a { 595 | background-color: #30a5ff; 596 | color: #fff!important; 597 | } 598 | 599 | .sidebar ul.nav li.parent ul li a { 600 | border: none; 601 | display:block; 602 | padding-left: 30px; 603 | line-height: 40px; 604 | } 605 | 606 | 607 | .sidebar span.glyphicon { 608 | margin-right: 10px; 609 | } 610 | 611 | .sidebar ul.nav li.divider { 612 | border-bottom: 1px solid #eee; 613 | margin: 20px 0; 614 | } 615 | 616 | .sidebar .attribution { 617 | position: absolute; 618 | bottom: 0px; 619 | width: 100%; 620 | padding: 15px; 621 | text-align: center; 622 | border-top: 1px solid #eee; 623 | font-size: 12px; 624 | } 625 | 626 | /*Breadcrumbs*/ 627 | 628 | .breadcrumb { 629 | border-radius: 0; 630 | padding: 10px 15px; 631 | background: #e9ecf2; 632 | box-shadow: 0 1px 1px rgba(0, 0, 0, .05); 633 | margin: 0 ; 634 | } 635 | 636 | h1.page-header { 637 | margin-top: 30px; 638 | border-bottom: 0; 639 | } 640 | 641 | /*Charts*/ 642 | 643 | .main-chart { 644 | background: #fff; 645 | } 646 | 647 | .easypiechart-panel { 648 | text-align: center; 649 | padding: 1px 0; 650 | margin-bottom: 20px; 651 | } 652 | 653 | .placeholder h2 { 654 | margin-bottom: 0px; 655 | } 656 | 657 | .donut { 658 | width: 100%; 659 | } 660 | 661 | .easypiechart { 662 | position: relative; 663 | text-align: center; 664 | width: 120px; 665 | height: 120px; 666 | margin: 20px auto 10px auto; 667 | } 668 | 669 | .easypiechart .percent { 670 | display: block; 671 | position: absolute; 672 | font-size: 26px; 673 | top: 38px; 674 | width: 120px; 675 | } 676 | 677 | #easypiechart-blue .percent { color: #30a5ff;} 678 | #easypiechart-teal .percent { color: #1ebfae;} 679 | #easypiechart-orange .percent { color: #ffb53e;} 680 | #easypiechart-red .percent { color: #ef4040;} 681 | 682 | /*Calendar Widget*/ 683 | 684 | #calendar, .datepicker-inline { 685 | width: 100%; 686 | } 687 | 688 | #calendar table { 689 | width: 100%; 690 | } 691 | 692 | .datepicker table tr td.old, 693 | .datepicker table tr td.new { 694 | color: rgba(255, 255, 255, .50); 695 | } 696 | 697 | .datepicker table tr td.active, 698 | .datepicker table tr td.active:hover, 699 | .datepicker table tr td.active.disabled, 700 | .datepicker table tr td.active.disabled:hover, 701 | .datepicker table tr td.active:hover, 702 | .datepicker table tr td.active:hover:hover, 703 | .datepicker table tr td.active.disabled:hover, 704 | .datepicker table tr td.active.disabled:hover:hover, 705 | .datepicker table tr td.active:focus, 706 | .datepicker table tr td.active:hover:focus, 707 | .datepicker table tr td.active.disabled:focus, 708 | .datepicker table tr td.active.disabled:hover:focus, 709 | .datepicker table tr td.active:active, 710 | .datepicker table tr td.active:hover:active, 711 | .datepicker table tr td.active.disabled:active, 712 | .datepicker table tr td.active.disabled:hover:active, 713 | .datepicker table tr td.active.active, 714 | .datepicker table tr td.active:hover.active, 715 | .datepicker table tr td.active.disabled.active, 716 | .datepicker table tr td.active.disabled:hover.active, 717 | .open .dropdown-toggle.datepicker table tr td.active, 718 | .open .dropdown-toggle.datepicker table tr td.active:hover, 719 | .open .dropdown-toggle.datepicker table tr td.active.disabled, 720 | .open .dropdown-toggle.datepicker table tr td.active.disabled:hover { 721 | color: #ffffff; 722 | background-color: rgba(0, 0, 0, .5); 723 | border-color: #285e8e; 724 | } 725 | 726 | .datepicker table tr td span:hover, 727 | .datepicker thead tr:first-child th:hover, 728 | .datepicker tfoot tr th:hover, 729 | .datepicker table tr td.day:hover, 730 | .datepicker table tr td.day.focused { 731 | background: rgba(0, 0, 0, 0.25); 732 | } 733 | 734 | .panel-heading .glyphicon { 735 | margin-right: 10px; 736 | } 737 | 738 | /*Todo List Widget*/ 739 | 740 | .todo-list-item .glyphicon { 741 | margin-right:5px; 742 | color: #9fadbb; 743 | } 744 | 745 | .todo-list-item .glyphicon:hover { 746 | margin-right:5px; 747 | color: #1b3548; 748 | } 749 | 750 | .todo-list { 751 | padding: 0; 752 | margin: -15px; 753 | background: #fff; 754 | color: #5f6468; 755 | } 756 | 757 | #checkbox { 758 | margin: 0; 759 | } 760 | 761 | .todo-list .checkbox { 762 | display:inline-block; 763 | margin: 0px; 764 | } 765 | 766 | .panel-body input[type=checkbox]:checked + label { 767 | text-decoration: line-through; 768 | color: #777; 769 | } 770 | 771 | .todo-list-item { 772 | list-style: none; 773 | line-height: 0.9; 774 | padding: 14px 15px 8px 15px; 775 | } 776 | 777 | .todo-list-item:hover, a.todo-list-item:focus { 778 | text-decoration: none; 779 | background-color: #f6f6f6; 780 | } 781 | 782 | .todo-list-item .trash .glyph:hover { 783 | color: #ef4040; 784 | } 785 | 786 | 787 | /*Chat Widget*/ 788 | 789 | .chat ul { 790 | list-style: none; 791 | margin: -15px; 792 | padding: 15px; 793 | } 794 | 795 | .chat ul li { 796 | margin-bottom: 10px; 797 | padding: 15px 5px; 798 | border-bottom: 1px solid #eee; 799 | } 800 | 801 | .chat ul li.left .chat-body { margin-left: 100px;} 802 | .chat ul li.right .chat-body { margin-right: 100px;} 803 | 804 | .chat ul li .chat-body p { 805 | margin: 0; 806 | } 807 | 808 | .chat ul .glyphicon { 809 | margin-right: 5px; 810 | } 811 | 812 | .chat .panel-body { 813 | overflow-y: scroll; 814 | height: 300px; 815 | } 816 | 817 | .chat-body small { 818 | margin-left: 5px; 819 | } 820 | 821 | /*Tables*/ 822 | .table { 823 | background: #fff; 824 | } 825 | 826 | .fixed-table-container { 827 | border: 1px solid #eee; 828 | } 829 | 830 | .fixed-table-container thead th { 831 | background: #f7f7f8; 832 | border-color: #ddd; 833 | color: #5f6468; 834 | font-weight: 300; 835 | font-size: 16px; 836 | } 837 | 838 | .fixed-table-container tbody td { 839 | border: 1px solid #eee; 840 | } 841 | 842 | .fixed-table-container tbody td:last-child { 843 | border-right: none; 844 | } 845 | 846 | .table>thead>tr>th { 847 | border-bottom: 1px solid #e6e7e8; 848 | vertical-align: middle; 849 | height: 50px; 850 | } 851 | 852 | .fixed-table-pagination .pagination { 853 | margin-top: 10px; 854 | margin-bottom: 0px; 855 | } 856 | .fixed-table-pagination .pagination-detail { 857 | margin-top: 20px; 858 | } 859 | 860 | /*Icons*/ 861 | 862 | 863 | .sidebar .glyph, .user-menu .glyph { 864 | height: 16px; 865 | width: 16px; 866 | margin: 0 10px 0 0; 867 | stroke-width: 3px; 868 | } 869 | 870 | .user-menu .glyph { 871 | stroke-width: 4px; 872 | } 873 | 874 | .breadcrumb .glyph { 875 | height: 14px; 876 | width: 14px; 877 | margin: -2px 0 0 0; 878 | stroke-width: 4px; 879 | } 880 | 881 | .alert .glyph, .panel-heading .glyph { 882 | width: 26px; 883 | height: 26px; 884 | margin: 0 10px 0 0; 885 | stroke-width: 2px; 886 | } 887 | 888 | .panel-widget .glyph { 889 | stroke-width: 2px; 890 | } 891 | 892 | .todo-list .glyph { 893 | width: 14px; 894 | height: 14px; 895 | stroke-width: 4px; 896 | color: #999; 897 | } 898 | 899 | .glyph.table { 900 | background: none; 901 | border: none; 902 | } 903 | 904 | /*Icon Grid*/ 905 | 906 | .icon-grid div { 907 | border: 1px solid #ddd; 908 | margin: 0 0 -1px -1px; 909 | text-align: center; 910 | padding: 10px 0 20px 0; 911 | } 912 | 913 | .icon-grid svg { 914 | width: 35%; 915 | display: block; 916 | margin: 0 auto; 917 | } 918 | 919 | .icon-grid h4 { 920 | display: none; 921 | } 922 | 923 | .icon-grid pre { 924 | margin: 10px 10px -10px 10px; 925 | border-radius: 0; 926 | font-size: 10px; 927 | border-color: #ddd; 928 | height: 65px; 929 | overflow: scroll; 930 | } 931 | 932 | 933 | 934 | 935 | 936 | 937 | 938 | 939 | 940 | -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xsec-lab/x-waf-admin/ebf861a9965e77597d6926ddb344237a6b30afd2/public/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xsec-lab/x-waf-admin/ebf861a9965e77597d6926ddb344237a6b30afd2/public/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xsec-lab/x-waf-admin/ebf861a9965e77597d6926ddb344237a6b30afd2/public/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /public/js/chart-data.js: -------------------------------------------------------------------------------- 1 | var randomScalingFactor = function(){ return Math.round(Math.random()*1000)}; 2 | 3 | var lineChartData = { 4 | labels : ["January","February","March","April","May","June","July"], 5 | datasets : [ 6 | { 7 | label: "My First dataset", 8 | fillColor : "rgba(220,220,220,0.2)", 9 | strokeColor : "rgba(220,220,220,1)", 10 | pointColor : "rgba(220,220,220,1)", 11 | pointStrokeColor : "#fff", 12 | pointHighlightFill : "#fff", 13 | pointHighlightStroke : "rgba(220,220,220,1)", 14 | data : [randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()] 15 | }, 16 | { 17 | label: "My Second dataset", 18 | fillColor : "rgba(48, 164, 255, 0.2)", 19 | strokeColor : "rgba(48, 164, 255, 1)", 20 | pointColor : "rgba(48, 164, 255, 1)", 21 | pointStrokeColor : "#fff", 22 | pointHighlightFill : "#fff", 23 | pointHighlightStroke : "rgba(48, 164, 255, 1)", 24 | data : [randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()] 25 | } 26 | ] 27 | 28 | } 29 | 30 | var barChartData = { 31 | labels : ["January","February","March","April","May","June","July"], 32 | datasets : [ 33 | { 34 | fillColor : "rgba(220,220,220,0.5)", 35 | strokeColor : "rgba(220,220,220,0.8)", 36 | highlightFill: "rgba(220,220,220,0.75)", 37 | highlightStroke: "rgba(220,220,220,1)", 38 | data : [randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()] 39 | }, 40 | { 41 | fillColor : "rgba(48, 164, 255, 0.2)", 42 | strokeColor : "rgba(48, 164, 255, 0.8)", 43 | highlightFill : "rgba(48, 164, 255, 0.75)", 44 | highlightStroke : "rgba(48, 164, 255, 1)", 45 | data : [randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()] 46 | } 47 | ] 48 | 49 | } 50 | 51 | var pieData = [ 52 | { 53 | value: 300, 54 | color:"#30a5ff", 55 | highlight: "#62b9fb", 56 | label: "Blue" 57 | }, 58 | { 59 | value: 50, 60 | color: "#ffb53e", 61 | highlight: "#fac878", 62 | label: "Orange" 63 | }, 64 | { 65 | value: 100, 66 | color: "#1ebfae", 67 | highlight: "#3cdfce", 68 | label: "Teal" 69 | }, 70 | { 71 | value: 120, 72 | color: "#f9243f", 73 | highlight: "#f6495f", 74 | label: "Red" 75 | } 76 | 77 | ]; 78 | 79 | var doughnutData = [ 80 | { 81 | value: 300, 82 | color:"#30a5ff", 83 | highlight: "#62b9fb", 84 | label: "Blue" 85 | }, 86 | { 87 | value: 50, 88 | color: "#ffb53e", 89 | highlight: "#fac878", 90 | label: "Orange" 91 | }, 92 | { 93 | value: 100, 94 | color: "#1ebfae", 95 | highlight: "#3cdfce", 96 | label: "Teal" 97 | }, 98 | { 99 | value: 120, 100 | color: "#f9243f", 101 | highlight: "#f6495f", 102 | label: "Red" 103 | } 104 | 105 | ]; 106 | 107 | window.onload = function(){ 108 | var chart1 = document.getElementById("line-chart").getContext("2d"); 109 | window.myLine = new Chart(chart1).Line(lineChartData, { 110 | responsive: true 111 | }); 112 | var chart2 = document.getElementById("bar-chart").getContext("2d"); 113 | window.myBar = new Chart(chart2).Bar(barChartData, { 114 | responsive : true 115 | }); 116 | var chart3 = document.getElementById("doughnut-chart").getContext("2d"); 117 | window.myDoughnut = new Chart(chart3).Doughnut(doughnutData, {responsive : true 118 | }); 119 | var chart4 = document.getElementById("pie-chart").getContext("2d"); 120 | window.myPie = new Chart(chart4).Pie(pieData, {responsive : true 121 | }); 122 | 123 | }; -------------------------------------------------------------------------------- /public/js/easypiechart-data.js: -------------------------------------------------------------------------------- 1 | $(function() { 2 | $('#easypiechart-teal').easyPieChart({ 3 | scaleColor: false, 4 | barColor: '#1ebfae' 5 | }); 6 | }); 7 | 8 | $(function() { 9 | $('#easypiechart-orange').easyPieChart({ 10 | scaleColor: false, 11 | barColor: '#ffb53e' 12 | }); 13 | }); 14 | 15 | $(function() { 16 | $('#easypiechart-red').easyPieChart({ 17 | scaleColor: false, 18 | barColor: '#f9243f' 19 | }); 20 | }); 21 | 22 | $(function() { 23 | $('#easypiechart-blue').easyPieChart({ 24 | scaleColor: false, 25 | barColor: '#30a5ff' 26 | }); 27 | }); 28 | 29 | $('#calendar').datepicker({ 30 | }); 31 | -------------------------------------------------------------------------------- /public/js/easypiechart.js: -------------------------------------------------------------------------------- 1 | /**! 2 | * easyPieChart 3 | * Lightweight plugin to render simple, animated and retina optimized pie charts 4 | * 5 | * @license 6 | * @author Robert Fleischmann (http://robert-fleischmann.de) 7 | * @version 2.1.5 8 | **/ 9 | 10 | (function(root, factory) { 11 | if(typeof exports === 'object') { 12 | module.exports = factory(require('jquery')); 13 | } 14 | else if(typeof define === 'function' && define.amd) { 15 | define(['jquery'], factory); 16 | } 17 | else { 18 | factory(root.jQuery); 19 | } 20 | }(this, function($) { 21 | 22 | /** 23 | * Renderer to render the chart on a canvas object 24 | * @param {DOMElement} el DOM element to host the canvas (root of the plugin) 25 | * @param {object} options options object of the plugin 26 | */ 27 | var CanvasRenderer = function(el, options) { 28 | var cachedBackground; 29 | var canvas = document.createElement('canvas'); 30 | 31 | el.appendChild(canvas); 32 | 33 | if (typeof(G_vmlCanvasManager) !== 'undefined') { 34 | G_vmlCanvasManager.initElement(canvas); 35 | } 36 | 37 | var ctx = canvas.getContext('2d'); 38 | 39 | canvas.width = canvas.height = options.size; 40 | 41 | // canvas on retina devices 42 | var scaleBy = 1; 43 | if (window.devicePixelRatio > 1) { 44 | scaleBy = window.devicePixelRatio; 45 | canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); 46 | canvas.width = canvas.height = options.size * scaleBy; 47 | ctx.scale(scaleBy, scaleBy); 48 | } 49 | 50 | // move 0,0 coordinates to the center 51 | ctx.translate(options.size / 2, options.size / 2); 52 | 53 | // rotate canvas -90deg 54 | ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); 55 | 56 | var radius = (options.size - options.lineWidth) / 2; 57 | if (options.scaleColor && options.scaleLength) { 58 | radius -= options.scaleLength + 2; // 2 is the distance between scale and bar 59 | } 60 | 61 | // IE polyfill for Date 62 | Date.now = Date.now || function() { 63 | return +(new Date()); 64 | }; 65 | 66 | /** 67 | * Draw a circle around the center of the canvas 68 | * @param {strong} color Valid CSS color string 69 | * @param {number} lineWidth Width of the line in px 70 | * @param {number} percent Percentage to draw (float between -1 and 1) 71 | */ 72 | var drawCircle = function(color, lineWidth, percent) { 73 | percent = Math.min(Math.max(-1, percent || 0), 1); 74 | var isNegative = percent <= 0 ? true : false; 75 | 76 | ctx.beginPath(); 77 | ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, isNegative); 78 | 79 | ctx.strokeStyle = color; 80 | ctx.lineWidth = lineWidth; 81 | 82 | ctx.stroke(); 83 | }; 84 | 85 | /** 86 | * Draw the scale of the chart 87 | */ 88 | var drawScale = function() { 89 | var offset; 90 | var length; 91 | 92 | ctx.lineWidth = 1; 93 | ctx.fillStyle = options.scaleColor; 94 | 95 | ctx.save(); 96 | for (var i = 24; i > 0; --i) { 97 | if (i % 6 === 0) { 98 | length = options.scaleLength; 99 | offset = 0; 100 | } else { 101 | length = options.scaleLength * 0.6; 102 | offset = options.scaleLength - length; 103 | } 104 | ctx.fillRect(-options.size/2 + offset, 0, length, 1); 105 | ctx.rotate(Math.PI / 12); 106 | } 107 | ctx.restore(); 108 | }; 109 | 110 | /** 111 | * Request animation frame wrapper with polyfill 112 | * @return {function} Request animation frame method or timeout fallback 113 | */ 114 | var reqAnimationFrame = (function() { 115 | return window.requestAnimationFrame || 116 | window.webkitRequestAnimationFrame || 117 | window.mozRequestAnimationFrame || 118 | function(callback) { 119 | window.setTimeout(callback, 1000 / 60); 120 | }; 121 | }()); 122 | 123 | /** 124 | * Draw the background of the plugin including the scale and the track 125 | */ 126 | var drawBackground = function() { 127 | if(options.scaleColor) drawScale(); 128 | if(options.trackColor) drawCircle(options.trackColor, options.lineWidth, 1); 129 | }; 130 | 131 | /** 132 | * Canvas accessor 133 | */ 134 | this.getCanvas = function() { 135 | return canvas; 136 | }; 137 | 138 | /** 139 | * Canvas 2D context 'ctx' accessor 140 | */ 141 | this.getCtx = function() { 142 | return ctx; 143 | }; 144 | 145 | /** 146 | * Clear the complete canvas 147 | */ 148 | this.clear = function() { 149 | ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); 150 | }; 151 | 152 | /** 153 | * Draw the complete chart 154 | * @param {number} percent Percent shown by the chart between -100 and 100 155 | */ 156 | this.draw = function(percent) { 157 | // do we need to render a background 158 | if (!!options.scaleColor || !!options.trackColor) { 159 | // getImageData and putImageData are supported 160 | if (ctx.getImageData && ctx.putImageData) { 161 | if (!cachedBackground) { 162 | drawBackground(); 163 | cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy); 164 | } else { 165 | ctx.putImageData(cachedBackground, 0, 0); 166 | } 167 | } else { 168 | this.clear(); 169 | drawBackground(); 170 | } 171 | } else { 172 | this.clear(); 173 | } 174 | 175 | ctx.lineCap = options.lineCap; 176 | 177 | // if barcolor is a function execute it and pass the percent as a value 178 | var color; 179 | if (typeof(options.barColor) === 'function') { 180 | color = options.barColor(percent); 181 | } else { 182 | color = options.barColor; 183 | } 184 | 185 | // draw bar 186 | drawCircle(color, options.lineWidth, percent / 100); 187 | }.bind(this); 188 | 189 | /** 190 | * Animate from some percent to some other percentage 191 | * @param {number} from Starting percentage 192 | * @param {number} to Final percentage 193 | */ 194 | this.animate = function(from, to) { 195 | var startTime = Date.now(); 196 | options.onStart(from, to); 197 | var animation = function() { 198 | var process = Math.min(Date.now() - startTime, options.animate.duration); 199 | var currentValue = options.easing(this, process, from, to - from, options.animate.duration); 200 | this.draw(currentValue); 201 | options.onStep(from, to, currentValue); 202 | if (process >= options.animate.duration) { 203 | options.onStop(from, to); 204 | } else { 205 | reqAnimationFrame(animation); 206 | } 207 | }.bind(this); 208 | 209 | reqAnimationFrame(animation); 210 | }.bind(this); 211 | }; 212 | 213 | var EasyPieChart = function(el, opts) { 214 | var defaultOptions = { 215 | barColor: '#ef1e25', 216 | trackColor: '#f9f9f9', 217 | scaleColor: '#dfe0e0', 218 | scaleLength: 5, 219 | lineCap: 'round', 220 | lineWidth: 3, 221 | size: 110, 222 | rotate: 0, 223 | animate: { 224 | duration: 1000, 225 | enabled: true 226 | }, 227 | easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ 228 | t = t / (d/2); 229 | if (t < 1) { 230 | return c / 2 * t * t + b; 231 | } 232 | return -c/2 * ((--t)*(t-2) - 1) + b; 233 | }, 234 | onStart: function(from, to) { 235 | return; 236 | }, 237 | onStep: function(from, to, currentValue) { 238 | return; 239 | }, 240 | onStop: function(from, to) { 241 | return; 242 | } 243 | }; 244 | 245 | // detect present renderer 246 | if (typeof(CanvasRenderer) !== 'undefined') { 247 | defaultOptions.renderer = CanvasRenderer; 248 | } else if (typeof(SVGRenderer) !== 'undefined') { 249 | defaultOptions.renderer = SVGRenderer; 250 | } else { 251 | throw new Error('Please load either the SVG- or the CanvasRenderer'); 252 | } 253 | 254 | var options = {}; 255 | var currentValue = 0; 256 | 257 | /** 258 | * Initialize the plugin by creating the options object and initialize rendering 259 | */ 260 | var init = function() { 261 | this.el = el; 262 | this.options = options; 263 | 264 | // merge user options into default options 265 | for (var i in defaultOptions) { 266 | if (defaultOptions.hasOwnProperty(i)) { 267 | options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; 268 | if (typeof(options[i]) === 'function') { 269 | options[i] = options[i].bind(this); 270 | } 271 | } 272 | } 273 | 274 | // check for jQuery easing 275 | if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { 276 | options.easing = jQuery.easing[options.easing]; 277 | } else { 278 | options.easing = defaultOptions.easing; 279 | } 280 | 281 | // process earlier animate option to avoid bc breaks 282 | if (typeof(options.animate) === 'number') { 283 | options.animate = { 284 | duration: options.animate, 285 | enabled: true 286 | }; 287 | } 288 | 289 | if (typeof(options.animate) === 'boolean' && !options.animate) { 290 | options.animate = { 291 | duration: 1000, 292 | enabled: options.animate 293 | }; 294 | } 295 | 296 | // create renderer 297 | this.renderer = new options.renderer(el, options); 298 | 299 | // initial draw 300 | this.renderer.draw(currentValue); 301 | 302 | // initial update 303 | if (el.dataset && el.dataset.percent) { 304 | this.update(parseFloat(el.dataset.percent)); 305 | } else if (el.getAttribute && el.getAttribute('data-percent')) { 306 | this.update(parseFloat(el.getAttribute('data-percent'))); 307 | } 308 | }.bind(this); 309 | 310 | /** 311 | * Update the value of the chart 312 | * @param {number} newValue Number between 0 and 100 313 | * @return {object} Instance of the plugin for method chaining 314 | */ 315 | this.update = function(newValue) { 316 | newValue = parseFloat(newValue); 317 | if (options.animate.enabled) { 318 | this.renderer.animate(currentValue, newValue); 319 | } else { 320 | this.renderer.draw(newValue); 321 | } 322 | currentValue = newValue; 323 | return this; 324 | }.bind(this); 325 | 326 | /** 327 | * Disable animation 328 | * @return {object} Instance of the plugin for method chaining 329 | */ 330 | this.disableAnimation = function() { 331 | options.animate.enabled = false; 332 | return this; 333 | }; 334 | 335 | /** 336 | * Enable animation 337 | * @return {object} Instance of the plugin for method chaining 338 | */ 339 | this.enableAnimation = function() { 340 | options.animate.enabled = true; 341 | return this; 342 | }; 343 | 344 | init(); 345 | }; 346 | 347 | $.fn.easyPieChart = function(options) { 348 | return this.each(function() { 349 | var instanceOptions; 350 | 351 | if (!$.data(this, 'easyPieChart')) { 352 | instanceOptions = $.extend({}, options, $(this).data()); 353 | $.data(this, 'easyPieChart', new EasyPieChart(this, instanceOptions)); 354 | } 355 | }); 356 | }; 357 | 358 | 359 | })); 360 | -------------------------------------------------------------------------------- /public/js/html5shiv.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @preserve HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed 3 | */ 4 | !function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.2",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b)}(this,document); -------------------------------------------------------------------------------- /public/js/respond.min.js: -------------------------------------------------------------------------------- 1 | /*! Respond.js v1.4.2: min/max-width media query polyfill 2 | * Copyright 2014 Scott Jehl 3 | * Licensed under MIT 4 | * http://j.mp/respondjs */ 5 | 6 | !function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){v(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))},g=function(a){return a.replace(c.regex.minmaxwh,"").match(c.regex.other)};if(c.ajax=f,c.queue=d,c.unsupportedmq=g,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,comments:/\/\*[^*]*\*+([^/][^*]*\*+)*\//gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,maxw:/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,minmaxwh:/\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,other:/\([^\)]*\)/g},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var h,i,j,k=a.document,l=k.documentElement,m=[],n=[],o=[],p={},q=30,r=k.getElementsByTagName("head")[0]||l,s=k.getElementsByTagName("base")[0],t=r.getElementsByTagName("link"),u=function(){var a,b=k.createElement("div"),c=k.body,d=l.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=k.createElement("body"),c.style.background="none"),l.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&l.insertBefore(c,l.firstChild),a=b.offsetWidth,f?l.removeChild(c):c.removeChild(b),l.style.fontSize=d,e&&(c.style.fontSize=e),a=j=parseFloat(a)},v=function(b){var c="clientWidth",d=l[c],e="CSS1Compat"===k.compatMode&&d||k.body[c]||d,f={},g=t[t.length-1],p=(new Date).getTime();if(b&&h&&q>p-h)return a.clearTimeout(i),i=a.setTimeout(v,q),void 0;h=p;for(var s in m)if(m.hasOwnProperty(s)){var w=m[s],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?j||u():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?j||u():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(n[w.rules]))}for(var C in o)o.hasOwnProperty(C)&&o[C]&&o[C].parentNode===r&&r.removeChild(o[C]);o.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=k.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,r.insertBefore(E,g.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(k.createTextNode(F)),o.push(E)}},w=function(a,b,d){var e=a.replace(c.regex.comments,"").replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var h=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},i=!f&&d;b.length&&(b+="/"),i&&(f=1);for(var j=0;f>j;j++){var k,l,o,p;i?(k=d,n.push(h(a))):(k=e[j].match(c.regex.findStyles)&&RegExp.$1,n.push(RegExp.$2&&h(RegExp.$2))),o=k.split(","),p=o.length;for(var q=0;p>q;q++)l=o[q],g(l)||m.push({media:l.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:n.length-1,hasquery:l.indexOf("(")>-1,minw:l.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:l.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}v()},x=function(){if(d.length){var b=d.shift();f(b.href,function(c){w(c,b.href,b.media),p[b.href]=!0,a.setTimeout(function(){x()},0)})}},y=function(){for(var b=0;b 2 | 3 | 4 | 5 | waf admin 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 19 | 20 | 21 | 22 | 23 | 46 | 47 | 62 |
63 |
64 | 68 |
69 |
70 |
71 |

Site List

72 |
73 |
74 | 75 |
76 |
77 |
78 |
79 | 新增后端站点 80 |
81 |

{{.Flash.SuccessMsg}}

82 |
83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | {{range .sites}} 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | {{end}} 113 | 114 |
IDSite NamePortBackendClone-SiteSSL StatusDebug LevelUpdate TimeUpdate Times管理
{{.Id}}{{.SiteName}}{{.Port}}{{.BackendAddr}}{{.UnrealAddr}}{{.Ssl}}{{.DebugLevel}}{{.LastChange}}{{.Version}}editdelsync
115 | 118 |
119 |
120 |
121 | 122 |
123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 147 |
148 | 149 | 150 | 151 | -------------------------------------------------------------------------------- /templates/EditRule.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | waf admin 6 | 7 | 8 | 9 | 10 | 11 | 12 | 16 | 17 | 18 | 19 | 42 | 43 | 57 | 58 |
59 |
60 | 64 |
65 | 66 |
67 |
68 |

Edit waf Rules

69 |
70 |
71 | 72 |
73 |
74 |
75 |
76 | 83 |
84 |
85 |
86 |
87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 111 |
112 | 113 | 114 | 115 | -------------------------------------------------------------------------------- /templates/EditSite.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | waf admin 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 19 | 20 | 21 | 22 | 23 | 46 | 47 | 66 |
67 |
68 | 72 |
73 |
74 |
75 |

Site List

76 |
77 |
78 | 79 |
80 |
81 |
82 | 129 |
130 |
131 | 132 |
133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 157 |
158 | 159 | 160 | -------------------------------------------------------------------------------- /templates/EditUser.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | waf admins 6 | 7 | 8 | 9 | 10 | 11 | 12 | 16 | 17 | 18 | 19 | 42 | 43 | 61 | 62 |
63 |
64 | 68 |
69 | 70 |
71 |
72 |

User List

73 |
74 |
75 | 76 |
77 |
78 |
79 |
80 | 新增用户 81 |
82 |
83 | 90 |
91 |
92 |
93 |
94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 118 |
119 | 120 | 121 | 122 | -------------------------------------------------------------------------------- /templates/error.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | login 6 | 7 | 8 | 9 | 13 | 14 | -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | waf admin 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 19 | 20 | 21 | 22 | 23 | 47 | 48 | 89 | 90 |
91 |
92 | 96 |
97 | 98 |
99 |
100 |

Dashboard

101 |
102 |
103 | 104 |
105 |
106 |
107 |
108 |
109 | 110 |
111 |
112 |
120
113 |
New Orders
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 | 123 |
124 |
125 |
52
126 |
Comments
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 | 136 |
137 |
138 |
24
139 |
New Users
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 | 149 |
150 |
151 |
25.2k
152 |
Page Views
153 |
154 |
155 |
156 |
157 |
158 | 159 |
160 |
161 |
162 |
Site Traffic Overview
163 |
164 |
165 | 166 |
167 |
168 |
169 |
170 |
171 | 172 |
173 |
174 |
175 |
176 |

New Orders

177 |
92% 178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |

Comments

186 |
65% 187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |

New Users

195 |
56% 196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |

Visitors

204 |
27% 205 |
206 |
207 |
208 |
209 |
210 | 211 |
212 |
213 | 214 |
215 |
Chat
216 |
217 |
    218 |
  • 219 | 220 | User Avatar 221 | 222 |
    223 |
    224 | John Doe 32 mins ago 225 |
    226 |

    227 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ante turpis, rutrum ut ullamcorper sed, dapibus ac nunc. Vivamus luctus convallis mauris, eu gravida tortor aliquam ultricies. 228 |

    229 |
    230 |
  • 231 |
  • 232 | 233 | User Avatar 234 | 235 |
    236 |
    237 | Jane Doe 6 mins ago 238 |
    239 |

    240 | Mauris dignissim porta enim, sed commodo sem blandit non. Ut scelerisque sapien eu mauris faucibus ultrices. Nulla ac odio nisl. Proin est metus, interdum scelerisque quam eu, eleifend pretium nunc. Suspendisse finibus auctor lectus, eu interdum sapien. 241 |

    242 |
    243 |
  • 244 |
  • 245 | 246 | User Avatar 247 | 248 |
    249 |
    250 | John Doe 32 mins ago 251 |
    252 |

    253 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ante turpis, rutrum ut ullamcorper sed, dapibus ac nunc. Vivamus luctus convallis mauris, eu gravida tortor aliquam ultricies. 254 |

    255 |
    256 |
  • 257 |
258 |
259 | 260 | 268 |
269 | 270 |
271 | 272 |
273 | 274 |
275 |
To-do List
276 |
277 |
    278 |
  • 279 |
    280 | 281 | 282 |
    283 |
    284 | 285 | 286 | 287 |
    288 |
  • 289 |
  • 290 |
    291 | 292 | 293 |
    294 |
    295 | 296 | 297 | 298 |
    299 |
  • 300 |
  • 301 |
    302 | 303 | 304 |
    305 |
    306 | 307 | 308 | 309 |
    310 |
  • 311 |
  • 312 |
    313 | 314 | 315 |
    316 |
    317 | 318 | 319 | 320 |
    321 |
  • 322 |
  • 323 |
    324 | 325 | 326 |
    327 |
    328 | 329 | 330 | 331 |
    332 |
  • 333 |
  • 334 |
    335 | 336 | 337 |
    338 |
    339 | 340 | 341 | 342 |
    343 |
  • 344 |
345 |
346 | 354 |
355 | 356 |
357 |
358 |
359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 385 | 386 | 387 | -------------------------------------------------------------------------------- /templates/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | waf admin 6 | 7 | 8 | 9 | 10 | 11 | 15 | 16 | 17 |
18 |
19 | 44 |
45 |
46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /templates/newRule.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | waf admin 6 | 7 | 8 | 9 | 10 | 11 | 12 | 16 | 17 | 18 | 19 | 42 | 43 | 57 | 58 |
59 |
60 | 64 |
65 | 66 |
67 |
68 |

add {{.ruleType}}

69 |
70 |
71 | 72 |
73 |
74 |
75 |
76 | 77 |
78 | 79 |
80 |
81 | 82 |
83 |
84 |
85 |
86 |
87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 111 |
112 | 113 | 114 | 115 | -------------------------------------------------------------------------------- /templates/newSite.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | waf admins 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 19 | 20 | 21 | 22 | 23 | 46 | 47 | 66 |
67 |
68 | 72 |
73 |
74 |
75 |

Site List

76 |
77 |
78 | 79 |
80 |
81 |
82 | 111 |
112 |
113 | 114 |
115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 139 |
140 | 141 | 142 | -------------------------------------------------------------------------------- /templates/newUser.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | waf admin 6 | 7 | 8 | 9 | 10 | 11 | 12 | 16 | 17 | 18 | 19 | 42 | 43 | 61 | 62 |
63 |
64 | 68 |
69 | 70 |
71 |
72 |

User List

73 |
74 |
75 | 76 |
77 |
78 |
79 |
80 |

Add a new user

81 | 82 |
83 | 84 |
85 |
86 | 87 |
88 |
89 | 90 |
91 |
92 |
93 |
94 |
95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 119 |
120 | 121 | 122 | 123 | -------------------------------------------------------------------------------- /templates/proxy.tmpl: -------------------------------------------------------------------------------- 1 | upstream proxy_{{.site.SiteName}} { {{range .site.BackendAddr}} 2 | server {{.}} max_fails=3 fail_timeout=20s; 3 | {{end}} } 4 | 5 | upstream unreal_{{.site.SiteName}} { {{range .site.UnrealAddr}} 6 | server {{.}} max_fails=3 fail_timeout=20s; 7 | {{end}} } 8 | 9 | server { 10 | listen {{.site.Port}}; 11 | ssl {{.site.Ssl}}; 12 | server_name {{.site.SiteName}}; 13 | client_max_body_size 100m; 14 | charset utf-8; 15 | access_log /var/log/nginx/{{.site.SiteName}}-access.log; 16 | error_log /var/log/nginx/{{.site.SiteName}}-debug.log {{.site.DebugLevel}}; 17 | 18 | location ~* ^/ { 19 | access_by_lua 'waf.start_jingshuishuiyue()'; 20 | proxy_pass_header Server; 21 | proxy_set_header Host $http_host; 22 | proxy_redirect off; 23 | proxy_set_header X-Real-IP $remote_addr; 24 | proxy_set_header X-Scheme $scheme; 25 | # proxy_pass $scheme://$target; 26 | proxy_pass $scheme://${target}{{.site.SiteName}}; 27 | } 28 | 29 | error_page 404 /index.html; 30 | error_page 500 502 503 504 /index.html; 31 | } 32 | -------------------------------------------------------------------------------- /templates/rules.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | waf admin 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 19 | 20 | 21 | 22 | 23 | 45 | 46 | 61 |
62 |
63 | 67 |
68 |
69 |
70 |

waf rules

71 |
72 |
73 | 74 |
75 |
76 |
77 |
78 | 同步全部策略 79 |
80 |

{{.Flash.SuccessMsg}}

81 |
82 | {{range $ruleEN, $ruleCN := .RuleInfo}} 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | {{range index $.Rules $ruleEN }} 91 | 92 | 93 | 94 | 95 | 96 | 97 | {{end}} 98 | 99 |
IDRule新增{{$ruleCN}}
{{.Id}}{{.RuleItem}}editdel
100 | {{end}} 101 |
102 |
103 |
104 | 105 |
106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 130 |
131 | 132 | 133 | 134 | -------------------------------------------------------------------------------- /templates/user.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | waf admin 6 | 7 | 8 | 9 | 10 | 11 | 12 | 16 | 17 | 18 | 19 | 42 | 43 | 58 | 59 |
60 |
61 | 65 |
66 | 67 |
68 |
69 |

User List

70 |
71 |
72 | 73 |
74 |
75 |
76 |
77 | 新增用户 78 |
79 |
80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | {{range .users}} 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | {{end}} 97 | 98 |
IDUserNamePassword管理
{{.Id}}{{.UserName}}{{.Password}}editdel
99 |
100 |
101 |
102 |
103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 127 |
128 | 129 | 130 | 131 | --------------------------------------------------------------------------------