├── .gitignore ├── Screenshots ├── 1.png ├── 2.png ├── 3.png ├── 4.png ├── 5.png ├── 6.png ├── 7.png └── 8.png ├── htdocs └── luci-static │ ├── edge │ ├── logo.png │ ├── favicon.ico │ ├── background │ │ ├── 1.jpg │ │ ├── 2.jpg │ │ └── 3.jpg │ ├── fonts │ │ └── argon.woff │ ├── icons │ │ ├── arrow.svg │ │ └── spinner.svg │ ├── sun.svg │ ├── custom.css │ ├── glare.svg │ ├── waves.css │ ├── js │ │ ├── script.js │ │ └── jquery.min.js │ └── landscape.css │ └── resources │ └── menu-edge.js ├── root └── etc │ └── uci-defaults │ └── 30_luci-theme-edge ├── Makefile ├── luasrc └── view │ ├── themes │ └── edge │ │ ├── footer.htm │ │ ├── header_login.htm │ │ ├── sysauth.htm │ │ └── header.htm │ └── header_login.htm └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | /Screenshots 2 | -------------------------------------------------------------------------------- /Screenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiddin9/luci-theme-edge/HEAD/Screenshots/1.png -------------------------------------------------------------------------------- /Screenshots/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiddin9/luci-theme-edge/HEAD/Screenshots/2.png -------------------------------------------------------------------------------- /Screenshots/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiddin9/luci-theme-edge/HEAD/Screenshots/3.png -------------------------------------------------------------------------------- /Screenshots/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiddin9/luci-theme-edge/HEAD/Screenshots/4.png -------------------------------------------------------------------------------- /Screenshots/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiddin9/luci-theme-edge/HEAD/Screenshots/5.png -------------------------------------------------------------------------------- /Screenshots/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiddin9/luci-theme-edge/HEAD/Screenshots/6.png -------------------------------------------------------------------------------- /Screenshots/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiddin9/luci-theme-edge/HEAD/Screenshots/7.png -------------------------------------------------------------------------------- /Screenshots/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiddin9/luci-theme-edge/HEAD/Screenshots/8.png -------------------------------------------------------------------------------- /htdocs/luci-static/edge/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiddin9/luci-theme-edge/HEAD/htdocs/luci-static/edge/logo.png -------------------------------------------------------------------------------- /htdocs/luci-static/edge/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiddin9/luci-theme-edge/HEAD/htdocs/luci-static/edge/favicon.ico -------------------------------------------------------------------------------- /htdocs/luci-static/edge/background/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiddin9/luci-theme-edge/HEAD/htdocs/luci-static/edge/background/1.jpg -------------------------------------------------------------------------------- /htdocs/luci-static/edge/background/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiddin9/luci-theme-edge/HEAD/htdocs/luci-static/edge/background/2.jpg -------------------------------------------------------------------------------- /htdocs/luci-static/edge/background/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiddin9/luci-theme-edge/HEAD/htdocs/luci-static/edge/background/3.jpg -------------------------------------------------------------------------------- /htdocs/luci-static/edge/fonts/argon.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiddin9/luci-theme-edge/HEAD/htdocs/luci-static/edge/fonts/argon.woff -------------------------------------------------------------------------------- /root/etc/uci-defaults/30_luci-theme-edge: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | uci batch <<-EOF 3 | set luci.themes.Edge=/luci-static/edge 4 | set luci.main.mediaurlbase=/luci-static/edge 5 | commit luci 6 | EOF 7 | exit 0 8 | -------------------------------------------------------------------------------- /htdocs/luci-static/edge/icons/arrow.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright (C) 2008-2019 GaryPang 3 | # 4 | # This is free software, licensed under the Apache License, Version 2.0 . 5 | # 6 | 7 | include $(TOPDIR)/rules.mk 8 | 9 | LUCI_TITLE:=Edge Theme 10 | LUCI_DEPENDS:=+curl 11 | 12 | PKG_LICENSE:=Apache-2.0 13 | 14 | include $(TOPDIR)/feeds/luci/luci.mk 15 | 16 | # call BuildPackage - OpenWrt buildroot signature 17 | -------------------------------------------------------------------------------- /htdocs/luci-static/edge/icons/spinner.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /htdocs/luci-static/edge/sun.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /luasrc/view/themes/edge/footer.htm: -------------------------------------------------------------------------------- 1 | <%# 2 | edge is a clean HTML5 theme for LuCI. It is based on luci-theme-material edge Template 3 | 4 | luci-theme-edge 5 | Copyright 2019 Jerrykuku 6 | 7 | Have a bug? Please create an issue here on GitHub! 8 | https://github.com/jerrykuku/luci-theme-edge/issues 9 | 10 | luci-theme-material: 11 | Copyright 2015 Lutty Yang 12 | 13 | Agron Theme 14 | https://demos.creative-tim.com/edge-dashboard/index.html 15 | 16 | Licensed to the public under the Apache License 2.0 17 | -%> 18 | 19 | <% local ver = require "luci.version" %> 20 | 21 | 25 | 26 | 27 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # luci-theme-edge 2 | 3 | [1]: https://img.shields.io/badge/license-MIT-brightgreen.svg 4 | [2]: /LICENSE 5 | [3]: https://img.shields.io/badge/PRs-welcome-brightgreen.svg 6 | [4]: https://github.com/https://github.com/kiddin9/luci-theme-edge/pulls 7 | [5]: https://img.shields.io/badge/Issues-welcome-brightgreen.svg 8 | [6]: https://github.com/https://github.com/kiddin9/luci-theme-edge/issues/new 9 | [7]: https://img.shields.io/badge/release-v2.1-blue.svg? 10 | [10]: https://img.shields.io/badge/Contact-telegram-blue 11 | [11]: https://t.me/openwrt_nginx 12 | [![license][1]][2] 13 | [![PRs Welcome][3]][4] 14 | [![Issue Welcome][5]][6] 15 | [![Contact Me][10]][11] 16 | 17 | Telegram 18 | 19 | A new Luci theme for LEDE/OpenWRT 20 | Edge is a clean HTML5 theme for LuCI. It is based on luci-theme-argon Template 21 | 22 | Master branch adapt to official mainline snapshot. 23 | Luci 18.06: https://github.com/kiddin9/luci-theme-edge/tree/18.06 24 | 25 | ## Thanks to 26 | luci-theme-argon: https://github.com/jerrykuku/luci-theme-argon 27 | 28 | ![](/Screenshots/1.png) 29 | ![](/Screenshots/2.png) 30 | ![](/Screenshots/3.png) 31 | ![](/Screenshots/4.png) 32 | ![](/Screenshots/5.png) 33 |
34 |
35 |
36 | 37 | -------------------------------------------------------------------------------- /htdocs/luci-static/edge/custom.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --main-color: #09c; 3 | --header-bg: #09c; 4 | --header-color: #fff; 5 | --bar-bg: #5e72e4; 6 | --menu-bg-color: #fff; 7 | --menu-color: #5f6368; 8 | --menu-color-hover: #202124; 9 | --main-menu-color: #202124; 10 | --submenu-bg-hover: #d4d4d4; 11 | --submenu-bg-hover-active: #09c; 12 | 13 | --blue: #5e72e4; 14 | --indigo: #5603ad; 15 | --purple: #8965e0; 16 | --pink: #f3a4b5; 17 | --red: #f5365c; 18 | --orange: #fb6340; 19 | --yellow: #ffd600; 20 | --green: #2dce89; 21 | --teal: #11cdef; 22 | --cyan: #2bffc6; 23 | --white: #fff; 24 | --gray: #8898aa; 25 | --gray-dark: #32325d; 26 | --light: #96999c; 27 | --lighter: #e9ecef; 28 | --primary: #5e72e4; 29 | --secondary: #f7fafc; 30 | --success: #2dce89; 31 | --info: #11cdef; 32 | --warning: #fb6340; 33 | --danger: #f5365c; 34 | --dark: #212529; 35 | --default: #172b4d; 36 | --white: #fff; 37 | --neutral: #fff; 38 | --darker: black; 39 | --breakpoint-xs: 0; 40 | --breakpoint-sm: 576px; 41 | --breakpoint-md: 768px; 42 | --breakpoint-lg: 992px; 43 | --breakpoint-xl: 1200px; 44 | 45 | --font-body: "Microsoft Yahei", "WenQuanYi Micro Hei", "sans-serif", "Helvetica Neue", "Helvetica", "Hiragino Sans GB"; 46 | } 47 | -------------------------------------------------------------------------------- /luasrc/view/header_login.htm: -------------------------------------------------------------------------------- 1 | <%# 2 | Copyright 2008 Steven Barth 3 | Copyright 2008-2019 Jo-Philipp Wich 4 | Licensed to the public under the Apache License 2.0. 5 | -%> 6 | 7 | <% 8 | if not luci.dispatcher.context.template_header_sent then 9 | include("themes/" .. theme .. "/header_login") 10 | luci.dispatcher.context.template_header_sent = true 11 | end 12 | 13 | local applyconf = luci.config and luci.config.apply 14 | %> 15 | 16 | 17 | 18 | 39 | -------------------------------------------------------------------------------- /htdocs/luci-static/edge/glare.svg: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /luasrc/view/themes/edge/header_login.htm: -------------------------------------------------------------------------------- 1 | <%# 2 | Edge is a clean HTML5 theme for LuCI. It is based on luci-theme-material edge Template 3 | 4 | luci-theme-Edge 5 | Copyright 2020 Kiddin' 6 | 7 | Have a bug? Please create an issue here on GitHub! 8 | https://github.com/kiddin9/luci-theme-edge/issues 9 | 10 | luci-theme-Argon: 11 | Copyright 2019 Jerrykuku 12 | 13 | Edge Theme 14 | https://demos.creative-tim.com/edge-dashboard/index.html 15 | 16 | Licensed to the public under the Apache License 2.0 17 | -%> 18 | 19 | <% 20 | local sys = require "luci.sys" 21 | local util = require "luci.util" 22 | local http = require "luci.http" 23 | local disp = require "luci.dispatcher" 24 | 25 | local boardinfo = util.ubus("system", "board") 26 | 27 | local node = disp.context.dispatched 28 | 29 | local fs = require "nixio.fs" 30 | local nutil = require "nixio.util" 31 | 32 | 33 | 34 | -- send as HTML5 35 | http.prepare_content("text/html") 36 | 37 | math.randomseed(os.time()) 38 | 39 | 40 | -%> 41 | 42 | 43 | 44 | 45 | 46 | 47 | <%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> 48 | - LuCI 49 | 50 | 51 | 52 | 53 | 54 | 55 | - LuCI"> 56 | - LuCI"> 57 | 58 | 59 | 60 | 61 | 62 | 63 | <% if node and node.css then %> 64 | 65 | <% end -%> 66 | <% if css then %> 67 | 70 | <% end -%> 71 | 72 | 73 | 74 | 75 | 113 | 114 | 115 | "> 118 | 119 |

您使用的浏览器过于老旧, 120 | 请使用 Edge , Firefox 等高级浏览器.

121 | -------------------------------------------------------------------------------- /luasrc/view/themes/edge/sysauth.htm: -------------------------------------------------------------------------------- 1 | <%# 2 | Copyright 2008 Steven Barth 3 | Copyright 2008-2012 Jo-Philipp Wich 4 | Licensed to the public under the Apache License 2.0. 5 | -%> 6 | 7 | <%+header_login%> 8 | 9 |
imgimgimg 10 |
11 | 12 |
13 | 14 | 29 | 30 | 31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 | 41 |
42 |
43 |
44 | <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%> 45 |
46 |

<%:No password set!%>

47 |

<%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%> 48 |

49 |
50 | <%- end -%> 51 | <%- if fuser then %> 52 |
53 |

<%:Invalid username and/or password! Please try again.%>

54 |
55 | <% end -%> 56 | 62 |
63 | 64 | 65 | 66 |
67 | 68 | 69 |
70 |

71 |
72 | <%:Have a nice day. ✨%> 73 |
74 |
75 |
76 | 77 |
78 | 79 |
80 |
81 |
82 | 83 |
84 | 85 |
86 |
87 |
88 |
89 | 90 |
91 | 92 | 93 |
94 |
95 | 96 | 103 | 104 | 109 | 110 | <%+footer%> 111 | <% 112 | io.popen("(curl -k -L \"$(curl -s https://instant.unsplash.com | grep -oE '\"raw\":\".*?\",\"full\"'| grep -o 'https://.*,' | sed 's/\",//g')q=80\&w=1680\" -o /www/luci-static/edge/background/1.jpg >/dev/null 2>&1) &") 113 | io.popen("(curl -k -L \"$(curl -s https://instant.unsplash.com | grep -oE '\"raw\":\".*?\",\"full\"'| grep -o 'https://.*,' | sed 's/\",//g')q=80\&w=1680\" -o /www/luci-static/edge/background/2.jpg >/dev/null 2>&1) &") 114 | io.popen("(curl -k -L \"$(curl -s https://instant.unsplash.com | grep -oE '\"raw\":\".*?\",\"full\"'| grep -o 'https://.*,' | sed 's/\",//g')q=80\&w=1680\" -o /www/luci-static/edge/background/3.jpg >/dev/null 2>&1) &") 115 | %> 116 | -------------------------------------------------------------------------------- /htdocs/luci-static/edge/waves.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Waves v0.7.6 3 | * http://fian.my.id/Waves 4 | * 5 | * Copyright 2014-2018 Alfiana E. Sibuea and other contributors 6 | * Released under the MIT license 7 | * https://github.com/fians/Waves/blob/master/LICENSE */ 8 | .waves-effect { 9 | position: relative; 10 | cursor: pointer; 11 | display: inline-block; 12 | overflow: hidden; 13 | -webkit-user-select: none; 14 | -moz-user-select: none; 15 | -ms-user-select: none; 16 | user-select: none; 17 | -webkit-tap-highlight-color: transparent; 18 | } 19 | .waves-effect .waves-ripple { 20 | position: absolute; 21 | border-radius: 50%; 22 | width: 100px; 23 | height: 100px; 24 | margin-top: -50px; 25 | margin-left: -50px; 26 | opacity: 0; 27 | background: rgba(0, 0, 0, 0.2); 28 | background: -webkit-radial-gradient(rgba(0, 0, 0, 0.2) 0, rgba(0, 0, 0, 0.3) 40%, rgba(0, 0, 0, 0.4) 50%, rgba(0, 0, 0, 0.5) 60%, rgba(255, 255, 255, 0) 70%); 29 | background: -o-radial-gradient(rgba(0, 0, 0, 0.2) 0, rgba(0, 0, 0, 0.3) 40%, rgba(0, 0, 0, 0.4) 50%, rgba(0, 0, 0, 0.5) 60%, rgba(255, 255, 255, 0) 70%); 30 | background: -moz-radial-gradient(rgba(0, 0, 0, 0.2) 0, rgba(0, 0, 0, 0.3) 40%, rgba(0, 0, 0, 0.4) 50%, rgba(0, 0, 0, 0.5) 60%, rgba(255, 255, 255, 0) 70%); 31 | background: radial-gradient(rgba(0, 0, 0, 0.2) 0, rgba(0, 0, 0, 0.3) 40%, rgba(0, 0, 0, 0.4) 50%, rgba(0, 0, 0, 0.5) 60%, rgba(255, 255, 255, 0) 70%); 32 | -webkit-transition: all 0.5s ease-out; 33 | -moz-transition: all 0.5s ease-out; 34 | -o-transition: all 0.5s ease-out; 35 | transition: all 0.5s ease-out; 36 | -webkit-transition-property: -webkit-transform, opacity; 37 | -moz-transition-property: -moz-transform, opacity; 38 | -o-transition-property: -o-transform, opacity; 39 | transition-property: transform, opacity; 40 | -webkit-transform: scale(0) translate(0, 0); 41 | -moz-transform: scale(0) translate(0, 0); 42 | -ms-transform: scale(0) translate(0, 0); 43 | -o-transform: scale(0) translate(0, 0); 44 | transform: scale(0) translate(0, 0); 45 | pointer-events: none; 46 | } 47 | .waves-effect.waves-light .waves-ripple { 48 | background: rgba(255, 255, 255, 0.4); 49 | background: -webkit-radial-gradient(rgba(255, 255, 255, 0.2) 0, rgba(255, 255, 255, 0.3) 40%, rgba(255, 255, 255, 0.4) 50%, rgba(255, 255, 255, 0.5) 60%, rgba(255, 255, 255, 0) 70%); 50 | background: -o-radial-gradient(rgba(255, 255, 255, 0.2) 0, rgba(255, 255, 255, 0.3) 40%, rgba(255, 255, 255, 0.4) 50%, rgba(255, 255, 255, 0.5) 60%, rgba(255, 255, 255, 0) 70%); 51 | background: -moz-radial-gradient(rgba(255, 255, 255, 0.2) 0, rgba(255, 255, 255, 0.3) 40%, rgba(255, 255, 255, 0.4) 50%, rgba(255, 255, 255, 0.5) 60%, rgba(255, 255, 255, 0) 70%); 52 | background: radial-gradient(rgba(255, 255, 255, 0.2) 0, rgba(255, 255, 255, 0.3) 40%, rgba(255, 255, 255, 0.4) 50%, rgba(255, 255, 255, 0.5) 60%, rgba(255, 255, 255, 0) 70%); 53 | } 54 | .waves-effect.waves-classic .waves-ripple { 55 | background: rgba(0, 0, 0, 0.2); 56 | } 57 | .waves-effect.waves-classic.waves-light .waves-ripple { 58 | background: rgba(255, 255, 255, 0.4); 59 | } 60 | .waves-notransition { 61 | -webkit-transition: none !important; 62 | -moz-transition: none !important; 63 | -o-transition: none !important; 64 | transition: none !important; 65 | } 66 | .waves-button, 67 | .waves-circle { 68 | -webkit-transform: translateZ(0); 69 | -moz-transform: translateZ(0); 70 | -ms-transform: translateZ(0); 71 | -o-transform: translateZ(0); 72 | transform: translateZ(0); 73 | -webkit-mask-image: -webkit-radial-gradient(circle, white 100%, black 100%); 74 | } 75 | .waves-button, 76 | .waves-button:hover, 77 | .waves-button:visited, 78 | .waves-button-input { 79 | white-space: nowrap; 80 | vertical-align: middle; 81 | cursor: pointer; 82 | border: none; 83 | outline: none; 84 | color: inherit; 85 | background-color: rgba(0, 0, 0, 0); 86 | font-size: 1em; 87 | line-height: 1em; 88 | text-align: center; 89 | text-decoration: none; 90 | z-index: 1; 91 | } 92 | .waves-button { 93 | padding: 0.85em 1.1em; 94 | border-radius: 0.2em; 95 | } 96 | .waves-button-input { 97 | margin: 0; 98 | padding: 0.85em 1.1em; 99 | } 100 | .waves-input-wrapper { 101 | border-radius: 0.2em; 102 | vertical-align: bottom; 103 | } 104 | .waves-input-wrapper.waves-button { 105 | padding: 0; 106 | } 107 | .waves-input-wrapper .waves-button-input { 108 | position: relative; 109 | top: 0; 110 | left: 0; 111 | z-index: 1; 112 | } 113 | .waves-circle { 114 | text-align: center; 115 | width: 2.5em; 116 | height: 2.5em; 117 | line-height: 2.5em; 118 | border-radius: 50%; 119 | } 120 | .waves-float { 121 | -webkit-mask-image: none; 122 | -webkit-box-shadow: 0px 1px 1.5px 1px rgba(0, 0, 0, 0.12); 123 | box-shadow: 0px 1px 1.5px 1px rgba(0, 0, 0, 0.12); 124 | -webkit-transition: all 300ms; 125 | -moz-transition: all 300ms; 126 | -o-transition: all 300ms; 127 | transition: all 300ms; 128 | } 129 | .waves-float:active { 130 | -webkit-box-shadow: 0px 8px 20px 1px rgba(0, 0, 0, 0.3); 131 | box-shadow: 0px 8px 20px 1px rgba(0, 0, 0, 0.3); 132 | } 133 | .waves-block { 134 | display: block; 135 | } 136 | -------------------------------------------------------------------------------- /htdocs/luci-static/resources/menu-edge.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 'require baseclass'; 3 | 'require ui'; 4 | 5 | return baseclass.extend({ 6 | __init__: function () { 7 | ui.menu.load().then(L.bind(this.render, this)); 8 | }, 9 | 10 | render: function (tree) { 11 | var node = tree, 12 | url = '', 13 | children = ui.menu.getChildren(tree); 14 | 15 | for (var i = 0; i < children.length; i++) { 16 | var isActive = (L.env.requestpath.length ? children[i].name == L.env.requestpath[0] : i == 0); 17 | 18 | if (isActive) 19 | this.renderMainMenu(children[i], children[i].name); 20 | } 21 | 22 | if (L.env.dispatchpath.length >= 3) { 23 | for (var i = 0; i < 3 && node; i++) { 24 | node = node.children[L.env.dispatchpath[i]]; 25 | url = url + (url ? '/' : '') + L.env.dispatchpath[i]; 26 | } 27 | 28 | if (node) 29 | this.renderTabMenu(node, url); 30 | } 31 | 32 | document.querySelector('a.showSide') 33 | .addEventListener('click', ui.createHandlerFn(this, 'handleSidebarToggle')); 34 | document.querySelector('.darkMask') 35 | .addEventListener('click', ui.createHandlerFn(this, 'handleSidebarToggle')); 36 | }, 37 | 38 | handleMenuExpand: function (ev) { 39 | var a = ev.target, slide = a.parentNode, slide_menu = a.nextElementSibling; 40 | var collapse = false; 41 | 42 | document.querySelectorAll('.main .main-left .nav > li >ul.active').forEach(function (ul) { 43 | $(ul).stop(true).slideUp("fast", function () { 44 | ul.classList.remove('active'); 45 | ul.previousElementSibling.classList.remove('active'); 46 | }); 47 | if (!collapse && ul === slide_menu) { 48 | collapse = true; 49 | } 50 | 51 | }); 52 | 53 | if (!slide_menu) 54 | return; 55 | 56 | 57 | if (!collapse) { 58 | $(slide).find(".slide-menu").slideDown("fast",function(){ 59 | slide_menu.classList.add('active'); 60 | a.classList.add('active'); 61 | }); 62 | a.blur(); 63 | } 64 | ev.preventDefault(); 65 | ev.stopPropagation(); 66 | }, 67 | 68 | renderMainMenu: function (tree, url, level) { 69 | var l = (level || 0) + 1, 70 | ul = E('ul', { 'class': level ? 'slide-menu' : 'nav' }), 71 | children = ui.menu.getChildren(tree); 72 | 73 | if (children.length == 0 || l > 2) 74 | return E([]); 75 | 76 | for (var i = 0; i < children.length; i++) { 77 | var isActive = ((L.env.dispatchpath[l] == children[i].name) && (L.env.dispatchpath[l - 1] == tree.name)), 78 | submenu = this.renderMainMenu(children[i], url + '/' + children[i].name, l), 79 | hasChildren = submenu.children.length, 80 | slideClass = hasChildren ? 'slide' : null, 81 | menuClass = hasChildren ? 'menu' : 'food'; 82 | if (isActive) { 83 | ul.classList.add('active'); 84 | slideClass += " active"; 85 | menuClass += " active"; 86 | } 87 | 88 | ul.appendChild(E('li', { 'class': slideClass }, [ 89 | E('a', { 90 | 'href': L.url(url, children[i].name), 91 | 'click': (l == 1) ? ui.createHandlerFn(this, 'handleMenuExpand') : null, 92 | 'class': menuClass, 93 | 'data-title': hasChildren ? children[i].title.replace(" ", "_") : children[i].title.replace(" ", "_"), 94 | }, [_(children[i].title)]), 95 | submenu 96 | ])); 97 | } 98 | 99 | if (l == 1) { 100 | document.querySelector('#mainmenu').appendChild(ul); 101 | document.querySelector('#mainmenu').style.display = ''; 102 | 103 | } 104 | return ul; 105 | }, 106 | 107 | renderTabMenu: function (tree, url, level) { 108 | var container = document.querySelector('#tabmenu'), 109 | l = (level || 0) + 1, 110 | ul = E('ul', { 'class': 'tabs' }), 111 | children = ui.menu.getChildren(tree), 112 | activeNode = null; 113 | 114 | if (children.length == 0) 115 | return E([]); 116 | 117 | for (var i = 0; i < children.length; i++) { 118 | var isActive = (L.env.dispatchpath[l + 2] == children[i].name), 119 | activeClass = isActive ? ' active' : '', 120 | className = 'tabmenu-item-%s %s'.format(children[i].name, activeClass); 121 | 122 | ul.appendChild(E('li', { 'class': className }, [ 123 | E('a', { 'href': L.url(url, children[i].name) }, [_(children[i].title)]) 124 | ])); 125 | 126 | if (isActive) 127 | activeNode = children[i]; 128 | } 129 | 130 | container.appendChild(ul); 131 | container.style.display = ''; 132 | 133 | if (activeNode) 134 | container.appendChild(this.renderTabMenu(activeNode, url + '/' + activeNode.name, l)); 135 | 136 | return ul; 137 | }, 138 | 139 | handleSidebarToggle: function (ev) { 140 | var showside = document.querySelector('a.showSide'), 141 | sidebar = document.querySelector('#mainmenu'), 142 | darkmask = document.querySelector('.darkMask'), 143 | scrollbar = document.querySelector('.main-right'); 144 | 145 | if (showside.classList.contains('active')) { 146 | showside.classList.remove('active'); 147 | sidebar.classList.remove('active'); 148 | scrollbar.classList.remove('active'); 149 | darkmask.classList.remove('active'); 150 | } 151 | else { 152 | showside.classList.add('active'); 153 | sidebar.classList.add('active'); 154 | scrollbar.classList.add('active'); 155 | darkmask.classList.add('active'); 156 | } 157 | } 158 | }); 159 | -------------------------------------------------------------------------------- /luasrc/view/themes/edge/header.htm: -------------------------------------------------------------------------------- 1 | <%# 2 | edge is a clean HTML5 theme for LuCI. It is based on luci-theme-material edge Template 3 | 4 | luci-theme-edge 5 | Copyright 2020 Kiddin' 6 | 7 | Have a bug? Please create an issue here on GitHub! 8 | https://github.com/jerrykuku/luci-theme-edge/issues 9 | 10 | luci-theme-material: 11 | Copyright 2015 Lutty Yang 12 | 13 | Agron Theme 14 | https://demos.creative-tim.com/edge-dashboard/index.html 15 | 16 | Licensed to the public under the Apache License 2.0 17 | -%> 18 | 19 | <% 20 | local sys = require "luci.sys" 21 | local util = require "luci.util" 22 | local http = require "luci.http" 23 | local disp = require "luci.dispatcher" 24 | 25 | local boardinfo = util.ubus("system", "board") 26 | 27 | local node = disp.context.dispatched 28 | 29 | local fs = require "nixio.fs" 30 | local nutil = require "nixio.util" 31 | 32 | 33 | 34 | -- send as HTML5 35 | http.prepare_content("text/html") 36 | 37 | math.randomseed(os.time()) 38 | 39 | -%> 40 | 41 | 42 | 43 | 44 | 45 | 46 | <%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> 47 | - LuCI 48 | 49 | 50 | 51 | 52 | 53 | 54 | - LuCI"> 55 | - LuCI"> 56 | 57 | 58 | 59 | 60 | 61 | <% if node and node.css then %> 62 | 63 | <% end -%> 64 | <% if css then %> 65 | 68 | <% end -%> 69 | 70 | 71 | 72 | 73 | 74 | 75 | "> 78 | 79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 | 104 |
105 |
106 |
107 |
108 |
109 |
110 | 111 | 112 | 113 |
114 |
115 |
116 | 117 |
118 |
119 |
120 | <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%> 121 |
122 |

<%:No password set!%>

123 |

<%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%> 124 |

125 | <% if disp.lookup("admin/system/admin") then %> 126 | 128 | <% end %> 129 |
130 | <%- end -%> 131 | 132 | 138 | 139 | 140 | -------------------------------------------------------------------------------- /htdocs/luci-static/edge/js/script.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Edge is a clean HTML5 theme for LuCI. It is based on luci-theme-Argon 3 | * 4 | * luci-theme-edge 5 | * Copyright 2020 Kiddin' 6 | * 7 | * Have a bug? Please create an issue here on GitHub! 8 | * https://github.com/kiddin9/luci-theme-edge/issues 9 | * 10 | * luci-theme-material: 11 | * Copyright 2015 Lutty Yang 12 | * https://github.com/LuttyYang/luci-theme-material/ 13 | * 14 | * Agron Theme 15 | * https://demos.creative-tim.com/argon-dashboard/index.html 16 | * 17 | * Login background 18 | * https://unsplash.com/ 19 | * Font generate by Icomoon 20 | * 21 | * Licensed to the public under the Apache License 2.0 22 | */ 23 | 24 | document.addEventListener('luci-loaded', function(ev) { 25 | (function ($) { 26 | $(".main > .loading").fadeOut(); 27 | 28 | /** 29 | * trim text, Remove spaces, wrap 30 | * @param text 31 | * @returns {string} 32 | */ 33 | function trimText(text) { 34 | return text.replace(/[ \t\n\r]+/g, " "); 35 | } 36 | 37 | var lastNode = undefined; 38 | var mainNodeName = undefined; 39 | 40 | var nodeUrl = ""; 41 | (function(node){ 42 | var luciLocation; 43 | if (node[0] == "admin"){ 44 | luciLocation = [node[1], node[2]]; 45 | }else{ 46 | luciLocation = node; 47 | } 48 | 49 | for(var i in luciLocation){ 50 | nodeUrl += luciLocation[i]; 51 | if (i != luciLocation.length - 1){ 52 | nodeUrl += "/"; 53 | } 54 | } 55 | })(luciLocation); 56 | 57 | /** 58 | * get the current node by Burl (primary) 59 | * @returns {boolean} success? 60 | */ 61 | function getCurrentNodeByUrl() { 62 | var ret = false; 63 | if (!$('body').hasClass('logged-in')) { 64 | luciLocation = ["Main", "Login"]; 65 | return true; 66 | } 67 | 68 | return ret; 69 | } 70 | 71 | /** 72 | * get current node and open it 73 | */ 74 | if (getCurrentNodeByUrl()) { 75 | mainNodeName = "node-" + luciLocation[0] + "-" + luciLocation[1]; 76 | mainNodeName = mainNodeName.replace(/[ \t\n\r\/]+/g, "_").toLowerCase(); 77 | $("body").addClass(mainNodeName); 78 | } 79 | 80 | /** 81 | * Sidebar expand 82 | */ 83 | var showSide = false; 84 | $(".showSide").click(function () { 85 | if (showSide) { 86 | $(".darkMask").stop(true).fadeOut("fast"); 87 | $(".main-left").stop(true).animate({ 88 | width: "0" 89 | }, "200"); 90 | $(".main-right").css("overflow-y", "visible"); 91 | showSide = false; 92 | } else { 93 | $(".darkMask").stop(true).fadeIn("fast"); 94 | $(".main-left").stop(true).animate({ 95 | width: "13rem" 96 | }, "200"); 97 | $(".main-right").css("overflow-y", "hidden"); 98 | showSide = true; 99 | } 100 | }); 101 | 102 | $(".darkMask").click(function () { 103 | if (showSide) { 104 | showSide = false; 105 | $(".darkMask").stop(true).fadeOut("fast"); 106 | $(".main-left").stop(true).animate({ 107 | width: "0" 108 | }, "fast"); 109 | $(".main-right").css("overflow-y", "visible"); 110 | } 111 | }); 112 | 113 | $(window).resize(function () { 114 | if ($(window).width() > 921) { 115 | $(".main-left").css("width", ""); 116 | $(".darkMask").stop(true); 117 | $(".darkMask").css("display", "none"); 118 | showSide = false; 119 | } 120 | }); 121 | 122 | /** 123 | * fix legend position 124 | */ 125 | $("legend").each(function () { 126 | var that = $(this); 127 | that.after("" + that.text() + ""); 128 | }); 129 | 130 | $(".cbi-section-table-titles, .cbi-section-table-descr, .cbi-section-descr").each(function () { 131 | var that = $(this); 132 | if (that.text().trim() == ""){ 133 | that.css("display", "none"); 134 | } 135 | }); 136 | 137 | $(".main-right").focus(); 138 | $(".main-right").blur(); 139 | $("input").attr("size", "0"); 140 | $(".cbi-button-up").val("__"); 141 | $(".cbi-button-down").val("__"); 142 | $(".slide > a").removeAttr("href"); 143 | 144 | if (mainNodeName != undefined) { 145 | console.log(mainNodeName); 146 | switch (mainNodeName) { 147 | case "node-status-system_log": 148 | case "node-status-kernel_log": 149 | $("#syslog").focus(function () { 150 | $("#syslog").blur(); 151 | $(".main-right").focus(); 152 | $(".main-right").blur(); 153 | }); 154 | break; 155 | case "node-status-firewall": 156 | var button = $(".node-status-firewall > .main fieldset li > a"); 157 | button.addClass("cbi-button cbi-button-reset a-to-btn"); 158 | break; 159 | case "node-system-reboot": 160 | var button = $(".node-system-reboot > .main > .main-right p > a"); 161 | button.addClass("cbi-button cbi-input-reset a-to-btn"); 162 | break; 163 | } 164 | } 165 | 166 | var getaudio = $('#player')[0]; 167 | /* Get the audio from the player (using the player's ID), the [0] is necessary */ 168 | var audiostatus = 'off'; 169 | /* Global variable for the audio's status (off or on). It's a bit crude but it works for determining the status. */ 170 | 171 | 172 | $(document).on('click touchend', '.speaker', function() { 173 | /* Touchend is necessary for mobile devices, click alone won't work */ 174 | if (!$('.speaker').hasClass("speakerplay")) { 175 | if (audiostatus == 'off') { 176 | $('.speaker').addClass('speakerplay'); 177 | getaudio.load(); 178 | getaudio.play(); 179 | audiostatus = 'on'; 180 | return false; 181 | } else if (audiostatus == 'on') { 182 | $('.speaker').addClass('speakerplay'); 183 | getaudio.play() 184 | } 185 | } else if ($('.speaker').hasClass("speakerplay")) { 186 | getaudio.pause(); 187 | $('.speaker').removeClass('speakerplay'); 188 | audiostatus = 'on'; 189 | } 190 | }); 191 | 192 | $('#player').on('ended', function() { 193 | $('.speaker').removeClass('speakerplay'); 194 | /*When the audio has finished playing, remove the class speakerplay*/ 195 | audiostatus = 'off'; 196 | /*Set the status back to off*/ 197 | }); 198 | setTimeout(function(){ 199 | $("input[type='checkbox']").filter(function () { 200 | return (!$(this).next("label").length) 201 | }).show(); 202 | }, 0); 203 | 204 | var options = { attributes: true}; 205 | function callback() { 206 | $("input[type='checkbox']").filter(function () { 207 | return (!$(this).next("label").length) 208 | }).show(); 209 | } 210 | var mutationObserver = new MutationObserver(callback); 211 | mutationObserver.observe($("body")[0], options); 212 | $(".cbi-value").has("textarea").css("background","none"); 213 | if(document.body.scrollHeight > window.innerHeight){ 214 | $(".cbi-page-actions.control-group").addClass("fixed") 215 | } 216 | })(jQuery); 217 | }); -------------------------------------------------------------------------------- /htdocs/luci-static/edge/landscape.css: -------------------------------------------------------------------------------- 1 | 2 | #CrossFade { 3 | background: #fff; 4 | position: absolute; 5 | width: 100%; 6 | height: 100%; 7 | overflow: hidden; 8 | } 9 | #CrossFade img { 10 | position: absolute; 11 | min-width: 100%; 12 | min-height: 100%; 13 | width:100%; 14 | background: #fff; 15 | -webkit-backface-visibility: hidden; 16 | backface-visibility: hidden; 17 | opacity: 0; 18 | -webkit-transform: scale(1.4) rotate(12deg); 19 | transform: scale(1.4) rotate(12deg); 20 | -webkit-animation: CrossFade 12s infinite; 21 | animation: CrossFade 12s infinite; 22 | } 23 | #CrossFade img:nth-child(3) { 24 | -webkit-animation-delay: 8s; 25 | animation-delay: 8s; 26 | } 27 | #CrossFade img:nth-child(2) { 28 | -webkit-animation-delay: 4s; 29 | animation-delay: 4s; 30 | } 31 | #CrossFade img:nth-child(1) { 32 | -webkit-animation-delay: 0s; 33 | animation-delay: 0s; 34 | } 35 | 36 | @-webkit-keyframes CrossFade { 37 | 33.3% { 38 | opacity: 1; 39 | -webkit-transform: scale(1) rotate(0); 40 | transform: scale(1) rotate(0); 41 | } 42 | 45% { 43 | opacity: 0; 44 | } 45 | } 46 | @keyframes CrossFade { 47 | 33.3% { 48 | opacity: 1; 49 | -webkit-transform: scale(1) rotate(0); 50 | transform: scale(1) rotate(0); 51 | } 52 | 45% { 53 | opacity: 0; 54 | } 55 | } 56 | 57 | .speaker { 58 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARAAAACACAYAAAG0HAZ0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MEFERTNEQzA3QTMxMTFFMzgzNTFFRDRCMzk1MDA0NUIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MEFERTNEQzE3QTMxMTFFMzgzNTFFRDRCMzk1MDA0NUIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowQURFM0RCRTdBMzExMUUzODM1MUVENEIzOTUwMDQ1QiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowQURFM0RCRjdBMzExMUUzODM1MUVENEIzOTUwMDQ1QiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvEtsecAABjVSURBVHjaYvz//z/D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); 59 | background-repeat: no-repeat; 60 | background-size: 200%; 61 | background-position: 100% 0; 62 | height: 34px; 63 | width: 28px; 64 | cursor: pointer; 65 | display: block; 66 | position: absolute; 67 | top: 20px; 68 | right: 20px; 69 | display: block; 70 | z-index:9999; 71 | opacity:.5; 72 | } 73 | 74 | .speakerplay { 75 | background-position: 0 0; 76 | } 77 | -------------------------------------------------------------------------------- /htdocs/luci-static/edge/js/jquery.min.js: -------------------------------------------------------------------------------- 1 | 2 | !function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0