diff --git a/package/lienol/luci-app-passwall/Makefile b/package/lienol/luci-app-passwall/Makefile index dbfeb51fba..d882a3760f 100644 --- a/package/lienol/luci-app-passwall/Makefile +++ b/package/lienol/luci-app-passwall/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2019 Lienol +# Copyright (C) 2018-2020 Lienol # # This is free software, licensed under the Apache License, Version 2.0 . # @@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall PKG_VERSION:=3.0 -PKG_RELEASE:=127-20191214 +PKG_RELEASE:=135-20191220 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) PO2LMO:=./po2lmo @@ -67,11 +67,7 @@ config PACKAGE_$(PKG_NAME)_INCLUDE_pdnsd config PACKAGE_$(PKG_NAME)_INCLUDE_dns2socks bool "Include dns2socks" - default n - -config PACKAGE_$(PKG_NAME)_INCLUDE_dns-forwarder - bool "Include dns-forwarder" - default n + default y endmenu endef @@ -95,8 +91,7 @@ define Package/$(PKG_NAME) +PACKAGE_$(PKG_NAME)_INCLUDE_haproxy:haproxy \ +PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS:openwrt_chinadns \ +PACKAGE_$(PKG_NAME)_INCLUDE_pdnsd:pdnsd-alt \ - +PACKAGE_$(PKG_NAME)_INCLUDE_dns2socks:dns2socks \ - +PACKAGE_$(PKG_NAME)_INCLUDE_dns-forwarder:dns-forwarder + +PACKAGE_$(PKG_NAME)_INCLUDE_dns2socks:dns2socks endef define Build/Prepare diff --git a/package/lienol/luci-app-passwall/README.md b/package/lienol/luci-app-passwall/README.md deleted file mode 100644 index c6da6db1b8..0000000000 --- a/package/lienol/luci-app-passwall/README.md +++ /dev/null @@ -1 +0,0 @@ -本人十分喜欢lean源码,但本插件并非魔改版SSR Plus,不喜欢勿用!!! diff --git a/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua b/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua index d434c08c04..a1d4f72e45 100644 --- a/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua +++ b/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua @@ -1,4 +1,4 @@ --- Copyright 2018-2019 Lienol +-- Copyright 2018-2020 Lienol module("luci.controller.passwall", package.seeall) local appname = "passwall" local http = require "luci.http" @@ -52,6 +52,8 @@ function index() true entry({"admin", "vpn", "passwall", "auto_ping_node"}, call("auto_ping_node")).leaf = true + entry({"admin", "vpn", "passwall", "auto_ping_node_list"}, + call("auto_ping_node_list")).leaf = true entry({"admin", "vpn", "passwall", "ping_node"}, call("ping_node")).leaf = true entry({"admin", "vpn", "passwall", "set_node"}, call("set_node")).leaf = @@ -188,7 +190,7 @@ function auto_ping_node() appname) == "1" and luci.sys.exec("echo -n `command -v tcping`") ~= "" then e.ping = luci.sys.exec( - "echo -n `tcping -q -c 1 -i 3 -p " .. port .. " " .. + "echo -n `tcping -q -c 1 -i 1 -p " .. port .. " " .. address .. " 2>&1 | grep -o 'time=[0-9]*' | awk -F '=' '{print$2}'`") else @@ -200,6 +202,33 @@ function auto_ping_node() luci.http.write_json(e) end +function auto_ping_node_list() + local e = {} + local json_str = luci.http.formvalue("json") + local json = luci.jsonc.parse(json_str) + local index = json["index"] + local address = json["address"] + local port = json["port"] + + local obj = {} + obj.index = index + if luci.sys.exec("echo -n `uci -q get %s.@global_other[0].use_tcping`" % + appname) == "1" and + luci.sys.exec("echo -n `command -v tcping`") ~= "" then + obj.ping = luci.sys.exec("echo -n `tcping -q -c 1 -i 1 -p " .. port .. + " " .. address .. + " 2>&1 | grep -o 'time=[0-9]*' | awk -F '=' '{print$2}'`") + else + obj.ping = luci.sys.exec( + "echo -n `ping -c 1 -W 1 %q 2>&1 | grep -o 'time=[0-9]*' | awk -F '=' '{print$2}'`" % + address) + end + e = obj + + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end + function ping_node() local e = {} local address = luci.http.formvalue("address") @@ -208,7 +237,7 @@ function ping_node() appname) == "1" and luci.sys.exec("echo -n `command -v tcping`") ~= "" then e.ping = luci.sys.exec( - "echo -n `tcping -q -c 1 -i 3 -p " .. port .. " " .. + "echo -n `tcping -q -c 1 -i 1 -p " .. port .. " " .. address .. " 2>&1 | grep -o 'time=[0-9]*' | awk -F '=' '{print$2}'`") else @@ -221,26 +250,14 @@ function ping_node() end function set_node() - local e = {} local protocol = luci.http.formvalue("protocol") local number = luci.http.formvalue("number") local section = luci.http.formvalue("section") - if protocol == "tcp" then - luci.sys.call("uci set passwall.@global[0].tcp_node" .. number .. "=" .. - section .. - " && uci commit passwall && /etc/init.d/passwall restart") - elseif protocol == "udp" then - luci.sys.call("uci set passwall.@global[0].udp_node" .. number .. "=" .. - section .. - " && uci commit passwall && /etc/init.d/passwall restart") - elseif protocol == "socks5" then - luci.sys.call( - "uci set passwall.@global[0].socks5_node" .. number .. "=" .. - section .. - " && uci commit passwall && /etc/init.d/passwall restart") - end - luci.http.prepare_content("application/json") - luci.http.write_json(e) + luci.sys.call("uci set passwall.@global[0]." .. protocol .. "_node" .. + number .. "=" .. section .. + " && uci commit passwall && /etc/init.d/passwall restart > /dev/null 2>&1 &") + luci.http.redirect(luci.dispatcher.build_url("admin", "vpn", "passwall", + "log")) end function copy_node() diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/global.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/global.lua index 731d77e1be..037abd2cc3 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/global.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/global.lua @@ -90,8 +90,8 @@ for i = 1, socks5_node_num, 1 do end ---- DNS Forward Mode -o = s:option(ListValue, "dns_mode", translate("DNS Forward Mode"), - translate("if you use no patterns are used, DNS of wan will be used by default as upstream of dnsmasq")) +o = s:option(ListValue, "dns_mode", translate("DNS Forward Mode"), translate( + "if you use no patterns are used, DNS of wan will be used by default as upstream of dnsmasq")) o.rmempty = false o:reset_values() if is_installed("openwrt_chinadns") or is_finded("chinadns") then @@ -100,27 +100,26 @@ end if is_installed("dns2socks") or is_finded("dns2socks") then o:value("dns2socks", "dns2socks " .. translate("Need Socks5 server")) end -if is_installed("pcap-dnsproxy") or is_finded("Pcap_DNSProxy") then - o:value("Pcap_DNSProxy", "Pcap_DNSProxy") -end if is_installed("pdnsd") or is_installed("pdnsd-alt") or is_finded("pdnsd") then o:value("pdnsd", "pdnsd") end o:value("local_7913", translate("Use local port 7913 as DNS")) o:value("nonuse", translate("No patterns are used")) +o = s:option(Value, "dns2socks_forward", translate("DNS Forward Address")) +o.default = "8.8.4.4" +o:value("8.8.4.4", "8.8.4.4(Google DNS1)") +o:value("8.8.8.8", "8.8.8.8(Google DNS2)") +o:value("208.67.222.222", "208.67.222.222(OpenDNS DNS1)") +o:value("208.67.220.220", "208.67.220.220(OpenDNS DNS2)") +o:depends("dns_mode", "dns2socks") + ---- upstreamm DNS Server for ChinaDNS o = s:option(ListValue, "up_chinadns_mode", translate("upstreamm DNS Server for ChinaDNS"), translate( "Domestic DNS server 1 in advanced Settings is used as domestic DNS by default")) o.default = "OpenDNS_1" o:depends("dns_mode", "chinadns") -if is_installed("dnsproxy") or is_finded("dnsproxy") then - o:value("dnsproxy", "dnsproxy") -end -if is_installed("dns-forwarder") or is_finded("dns-forwarder") then - o:value("dns-forwarder", "dns-forwarder") -end o:value("OpenDNS_1", "OpenDNS_1") o:value("OpenDNS_2", "OpenDNS_2") o:value("custom", translate("custom")) diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_list.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_list.lua index f0bbb155ec..cc15533b32 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_list.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_list.lua @@ -19,7 +19,11 @@ o.default = 1 ---- Auto Ping o = s:option(Flag, "auto_ping", translate("Auto Ping"), translate("This will automatically ping the node for latency")) -o.default = 0 +o.default = 1 + +---- Concise display nodes +o = s:option(Flag, "compact_display_nodes", translate("Concise display nodes")) +o.default = 1 -- [[ Add the node via the link ]]-- s:append(Template("passwall/node_list/link_add_node")) @@ -27,7 +31,6 @@ s:append(Template("passwall/node_list/link_add_node")) -- [[ Node List ]]-- s = m:section(TypedSection, "nodes") s.anonymous = true -s.sortable = true s.addremove = true s.template = "cbi/tblsection" s.extedit = d.build_url("admin", "vpn", "passwall", "node_config", "%s") @@ -43,32 +46,62 @@ function s.remove(t, a) luci.http.redirect(d.build_url("admin", "vpn", "passwall", "node_list")) end ----- Remarks -o = s:option(DummyValue, "remarks", translate("Remarks")) - ----- Add Mode -o = s:option(DummyValue, "add_mode", translate("Add Mode")) -o.cfgvalue = function(t, n) - local v = Value.cfgvalue(t, n) - if v and v ~= '' then - return v - else - return '手动' +-- 简洁模式 +if api.uci_get_type("global_other", "compact_display_nodes", "1") == "1" then + o = s:option(DummyValue, "group", translate("Group")) + o.width = "25%" + o.cfgvalue = function(t, n) + local group = api.uci_get_type_id(n, "group") or "无" + return group ~= "" and group or "无" end - return str -end ----- Type -o = s:option(DummyValue, "type", translate("Type")) + o = s:option(DummyValue, "remarks", translate("Remarks")) + o.cfgvalue = function(t, n) + local str = "" + local is_sub = api.uci_get_type_id(n, "is_sub") or "" + local group = api.uci_get_type_id(n, "group") or "" + local remarks = api.uci_get_type_id(n, "remarks") or "" + local type = api.uci_get_type_id(n, "type") or "" + local address = api.uci_get_type_id(n, "address") or "" + local port = api.uci_get_type_id(n, "port") or "" + if is_sub == "" and group == "" then + str = str .. type .. ":" + end + str = str .. remarks + if address ~= "" and port ~= "" then + local s = " (" .. address .. ":" .. port .. ")" + str = str .. s + end + return str + end +else + s.sortable = true + ---- Remarks + o = s:option(DummyValue, "remarks", translate("Remarks")) ----- Address -o = s:option(DummyValue, "address", translate("Address")) + ---- Add Mode + o = s:option(DummyValue, "add_mode", translate("Add Mode")) + o.cfgvalue = function(t, n) + local v = Value.cfgvalue(t, n) + if v and v ~= '' then + return v + else + return '手动' + end + return str + end ----- Port -o = s:option(DummyValue, "port", translate("Port")) + ---- Type + o = s:option(DummyValue, "type", translate("Type")) ----- Encrypt Method ---[[ o = s:option(DummyValue, "encrypt_method", translate("Encrypt Method")) + ---- Address + o = s:option(DummyValue, "address", translate("Address")) + + ---- Port + o = s:option(DummyValue, "port", translate("Port")) + + ---- Encrypt Method + --[[ o = s:option(DummyValue, "encrypt_method", translate("Encrypt Method")) o.width = "15%" o.cfgvalue = function(t, n) local str = "无" @@ -82,9 +115,11 @@ o.cfgvalue = function(t, n) end return str end--]] +end ---- Ping o = s:option(DummyValue, "ping", translate("Ping")) +o.width = "10%" if api.uci_get_type("global_other", "auto_ping", "0") == "0" then o.template = "passwall/node_list/ping" else diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/other.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/other.lua index f579d8092f..b25390304d 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/other.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/other.lua @@ -51,19 +51,6 @@ s = m:section(TypedSection, "global_dns", translate("DNS Settings")) s.anonymous = true s.addremove = false ----- DNS Forward Address -o = s:option(Value, "dns_forward", translate("DNS Forward Address")) -o.rmempty = false -o.default = "8.8.4.4:53" -o:value("8.8.4.4:53", "8.8.4.4:53(Google DNS1)") -o:value("8.8.8.8:53", "8.8.8.8:53(Google DNS2)") -o:value("208.67.222.222:53", "208.67.222.222:53(OpenDNS DNS1_53)") -o:value("208.67.222.222:5353", "208.67.222.222:5353(OpenDNS DNS1_5353)") -o:value("208.67.222.222:443", "208.67.222.222:443(OpenDNS DNS1_443)") -o:value("208.67.220.220:53", "208.67.220.220:53(OpenDNS DNS2_53)") -o:value("208.67.220.220:5353", "208.67.220.220:5353(OpenDNS DNS2_5353)") -o:value("208.67.220.220:443", "208.67.220.220:443(OpenDNS DNS2_443)") - ---- Mainland DNS Sever 1 o = s:option(Value, "dns_1", translate("Mainland DNS Sever 1")) o.rmempty = false diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/rule.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/rule.lua index de736c4e86..914e3668b1 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/rule.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/rule.lua @@ -28,36 +28,13 @@ o.default = 0 o:depends("auto_update", 1) -- [[ Subscribe Settings ]]-- -s = m:section(TypedSection, "global_subscribe", translate("Node Subscribe")) +s = m:section(TypedSection, "global_subscribe", translate("Node Subscribe"), + translate( + "Please input the subscription url first, save and submit before updating. If you subscribe to update, it is recommended to delete all subscriptions and then re-subscribe.")) s.anonymous = true ----- Subscribe URL -o = s:option(DynamicList, "subscribe_url", translate("Subscribe URL"), - translate( - "Please input the subscription url first, save and submit before updating. If you subscribe to update, it is recommended to delete all subscriptions and then re-subscribe.")) - ----- Subscribe Manually update -o = s:option(Button, "_update", translate("Manually update")) -o.inputstyle = "apply" -function o.write(e, e) - luci.sys - .call("nohup /usr/share/passwall/subscription.sh > /dev/null 2>&1 &") - luci.http.redirect(luci.dispatcher.build_url("admin", "vpn", "passwall", - "log")) -end - ----- Subscribe Delete All -o = s:option(Button, "_stop", translate("Delete All Subscribe Node")) -o.inputstyle = "remove" -function o.write(e, e) - luci.sys.call( - "nohup /usr/share/passwall/subscription.sh stop > /dev/null 2>&1 &") - luci.http.redirect(luci.dispatcher.build_url("admin", "vpn", "passwall", - "log")) -end - ---- Subscribe via proxy -o = s:option(Flag, "subscribe_by_ss", translate("Subscribe via proxy")) +o = s:option(Flag, "subscribe_proxy", translate("Subscribe via proxy")) o.default = 0 o.rmempty = false @@ -81,6 +58,43 @@ for e = 0, 23 do o:value(e, e .. translate("oclock")) end o.default = 0 o:depends("auto_update_subscribe", 1) +---- Subscribe Manually update +o = s:option(Button, "_update", translate("Manually update")) +o.inputstyle = "apply" +function o.write(e, e) + luci.sys + .call("nohup /usr/share/passwall/subscription.sh > /dev/null 2>&1 &") + luci.http.redirect(luci.dispatcher.build_url("admin", "vpn", "passwall", + "log")) +end + +---- Subscribe Delete All +o = s:option(Button, "_stop", translate("Delete All Subscribe Node")) +o.inputstyle = "remove" +function o.write(e, e) + luci.sys.call( + "nohup /usr/share/passwall/subscription.sh stop > /dev/null 2>&1 &") + luci.http.redirect(luci.dispatcher.build_url("admin", "vpn", "passwall", + "log")) +end + +s = m:section(TypedSection, "subscribe_list") +s.addremove = true +s.anonymous = true +s.sortable = true +s.template = "cbi/tblsection" + +o = s:option(Flag, "enabled", translate("Enabled")) +o.rmempty = false + +o = s:option(Value, "remark", translate("Subscribe Remark")) +o.width = "auto" +o.rmempty = false + +o = s:option(Value, "url", translate("Subscribe URL")) +o.width = "auto" +o.rmempty = false + -- [[ App Settings ]]-- s = m:section(TypedSection, "global_app", translate("App Update"), translate("Please confirm that your firmware supports FPU.")) diff --git a/package/lienol/luci-app-passwall/luasrc/view/passwall/global/status.htm b/package/lienol/luci-app-passwall/luasrc/view/passwall/global/status.htm index 83924ea1d4..55b5282ee3 100644 --- a/package/lienol/luci-app-passwall/luasrc/view/passwall/global/status.htm +++ b/package/lienol/luci-app-passwall/luasrc/view/passwall/global/status.htm @@ -362,22 +362,21 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md }, function(x, rv) { if (rv.status) { - var receiveDate = (new Date()).getTime(); - var responseTimeMs = receiveDate - sendDate; + var time = ((new Date()).getTime() - sendDate) / 1000; var speed = ""; - if (responseTimeMs < 300) { + if (time < 0.5) { s.className="green"; speed = "<%:very good%>"; - } else if (responseTimeMs < 600) { + } else if (time < 0.8) { s.className="green"; speed = "<%:good%>"; - } else if (responseTimeMs < 2000) { + } else if (time < 1.5) { s.className="yellow"; speed = "<%:general%>"; - } else if (responseTimeMs < 5000) { + } else if (time < 3) { s.className="red"; speed = "<%:bad%>"; - } else if (responseTimeMs >= 5000) { + } else if (time >= 3) { s.className="red"; speed = "<%:very bad%>"; } diff --git a/package/lienol/luci-app-passwall/luasrc/view/passwall/global/status2.htm b/package/lienol/luci-app-passwall/luasrc/view/passwall/global/status2.htm index f55ce1b0c8..ccf6d20424 100644 --- a/package/lienol/luci-app-passwall/luasrc/view/passwall/global/status2.htm +++ b/package/lienol/luci-app-passwall/luasrc/view/passwall/global/status2.htm @@ -216,23 +216,22 @@ local socks5_node_num = api.uci_get_type("global_other", "socks5_node_num", 1) var s = document.getElementById('_' + type + '_status'); if(s) { if(rv.status) { - var receiveDate = (new Date()).getTime(); - var responseTimeMs = receiveDate - sendDate; + var time = ((new Date()).getTime() - sendDate) / 1000; var speed = ""; var color="red"; - if (responseTimeMs < 300) { + if (time < 0.5) { color = "green"; speed = "<%:very good%>"; - } else if (responseTimeMs < 600) { + } else if (time < 0.8) { color = "green"; speed = "<%:good%>"; - } else if (responseTimeMs < 2000) { + } else if (time < 1.5) { color = "#b9b90b"; speed = "<%:general%>"; - } else if (responseTimeMs < 5000) { + } else if (time < 3) { color = "red"; speed = "<%:bad%>"; - } else if (responseTimeMs >= 5000) { + } else if (time >= 3) { color = "red"; speed = "<%:very bad%>"; } diff --git a/package/lienol/luci-app-passwall/luasrc/view/passwall/node_list/node_list.htm b/package/lienol/luci-app-passwall/luasrc/view/passwall/node_list/node_list.htm index e84834c43c..8f7cf6aa9e 100644 --- a/package/lienol/luci-app-passwall/luasrc/view/passwall/node_list/node_list.htm +++ b/package/lienol/luci-app-passwall/luasrc/view/passwall/node_list/node_list.htm @@ -5,6 +5,7 @@ local tcp_node_num = api.uci_get_type("global_other", "tcp_node_num", 1) local udp_node_num = api.uci_get_type("global_other", "udp_node_num", 1) local socks5_node_num = api.uci_get_type("global_other", "socks5_node_num", 1) + local compact_display_nodes = api.uci_get_type("global_other", "compact_display_nodes", 1) -%> + <% end -%> + + + + + +
+
+ + <%=boardinfo.hostname or "?"%> +
+ <% render_changes() %> + +
+
+
+
+
Loading...
+
+ <% render_topmenu() %> +
+
+
+
+
+ <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%> +
+

<%:No password set!%>

+ <%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%>
+ "><%:Go to password configuration...%> +
+ <%- end -%> + <% if category then render_tabmenu(category, cattree) end %> + + diff --git a/package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_dark_purple/footer.htm b/package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_dark_purple/footer.htm new file mode 100644 index 0000000000..d7d4db96d2 --- /dev/null +++ b/package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_dark_purple/footer.htm @@ -0,0 +1,51 @@ +<%# + Material is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI + + luci-theme-material + Copyright 2015 Lutty Yang + + Have a bug? Please create an issue here on GitHub! + https://github.com/LuttyYang/luci-theme-material/issues + + luci-theme-bootstrap: + Copyright 2008 Steven Barth + Copyright 2008 Jo-Philipp Wich + Copyright 2012 David Menting + + MUI: + https://github.com/muicss/mui + + Licensed to the public under the Apache License 2.0 +-%> + +<% + local ver = require "luci.version" + local disp = require "luci.dispatcher" + local request = disp.context.path + local category = request[1] + local tree = disp.node() + local categories = disp.node_childs(tree) +%> +
+ +
+
+ + + + + + diff --git a/package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_dark_purple/header.htm b/package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_dark_purple/header.htm new file mode 100644 index 0000000000..79c3a2e859 --- /dev/null +++ b/package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_dark_purple/header.htm @@ -0,0 +1,257 @@ +<%# + Material is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI + + luci-theme-material + Copyright 2015-2017 Lutty Yang + + Have a bug? Please create an issue here on GitHub! + https://github.com/LuttyYang/luci-theme-material/issues + + luci-theme-bootstrap: + Copyright 2008 Steven Barth + Copyright 2008-2016 Jo-Philipp Wich + Copyright 2012 David Menting + + MUI: + https://github.com/muicss/mui + + Licensed to the public under the Apache License 2.0 +-%> + +<% + local sys = require "luci.sys" + local util = require "luci.util" + local http = require "luci.http" + local disp = require "luci.dispatcher" + + local boardinfo = util.ubus("system", "board") + + local request = disp.context.path + local request2 = disp.context.request + + local category = request[1] + local cattree = category and disp.node(category) + + local leaf = request2[#request2] + + local tree = disp.node() + local node = disp.context.dispatched + + local categories = disp.node_childs(tree) + + local c = tree + local i, r + + -- tag all nodes leading to this page + for i, r in ipairs(request) do + if c.nodes and c.nodes[r] then + c = c.nodes[r] + c._menu_selected = true + end + end + + -- send as HTML5 + http.prepare_content("text/html") + + local function nodeurl(prefix, name, query) + local u = url(prefix, name) + if query then + u = u .. http.build_querystring(query) + end + return pcdata(u) + end + + local function render_tabmenu(prefix, node, level) + if not level then + level = 1 + end + + local childs = disp.node_childs(node) + if #childs > 0 then + if level > 2 then + write('
    ') + end + + local selected_node + local selected_name + local i, v + + for i, v in ipairs(childs) do + local nnode = node.nodes[v] + if nnode._menu_selected then + selected_node = nnode + selected_name = v + end + + if level > 2 then + write('
  • %s
  • ' %{ + v, (nnode._menu_selected or (node.leaf and v == leaf)) and 'active' or '', + nodeurl(prefix, v, nnode.query), + striptags(translate(nnode.title)) + }) + end + end + + if level > 2 then + write('
') + end + + if selected_node then + render_tabmenu(prefix .. "/" .. selected_name, selected_node, level + 1) + end + end + end + + local function render_submenu(prefix, node) + local childs = disp.node_childs(node) + if #childs > 0 then + write('
    ') + + for i, r in ipairs(childs) do + local nnode = node.nodes[r] + local title = pcdata(striptags(translate(nnode.title))) + + write('
  • %s
  • ' %{ + title, + nodeurl(prefix, r, nnode.query), + title + }) + end + + write('
') + end + end + + local function render_topmenu() + local childs = disp.node_childs(cattree) + if #childs > 0 then + write('') + end + end + + local function render_changes() + -- calculate the number of unsaved changes + if tree.nodes[category] and tree.nodes[category].ucidata then + local ucichanges = 0 + + for i, j in pairs(require("luci.model.uci").cursor():changes()) do + for k, l in pairs(j) do + for m, n in pairs(l) do + ucichanges = ucichanges + 1; + end + end + end + + if ucichanges > 0 then + write('%s: %d' %{ + url(category, 'uci/changes'), + http.urlencode(http.formvalue('redir') or table.concat(disp.context.request, "/")), + translate('Unsaved Changes'), + ucichanges + }) + end + end + end +-%> + + + + + <%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI + + + + + + + + + + + + + - LuCI"> + - LuCI"> + + + + + + + <% if node and node.css then %> + + <% end -%> + <% if css then %> + + <% end -%> + + + + + +
+
+ + <%=boardinfo.hostname or "?"%> +
+ <% render_changes() %> + +
+
+
+
+
Loading...
+
+ <% render_topmenu() %> +
+
+
+
+
+ <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%> +
+

<%:No password set!%>

+ <%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%>
+ "><%:Go to password configuration...%> +
+ <%- end -%> + <% if category then render_tabmenu(category, cattree) end %> + + diff --git a/package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_light/footer.htm b/package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_light/footer.htm new file mode 100644 index 0000000000..e63f26873d --- /dev/null +++ b/package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_light/footer.htm @@ -0,0 +1,63 @@ +<%# + Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material and Argon Template + + luci-theme-argon + Copyright 2019 Jerrykuku + + Have a bug? Please create an issue here on GitHub! + https://github.com/jerrykuku/luci-theme-argon/issues + + luci-theme-bootstrap: + Copyright 2008 Steven Barth + Copyright 2008-2016 Jo-Philipp Wich + Copyright 2012 David Menting + + MUI: + https://github.com/muicss/mui + + luci-theme-material: + https://github.com/LuttyYang/luci-theme-material/ + + Agron Theme + https://demos.creative-tim.com/argon-dashboard/index.html + + Login background + https://unsplash.com/ + + Font generate by Icomoon + https://icomoon.io/ + + Licensed to the public under the Apache License 2.0 +-%> + +<% + local ver = require "luci.version" + local disp = require "luci.dispatcher" + local request = disp.context.path + local category = request[1] + local tree = disp.node() + local categories = disp.node_childs(tree) +%> +
+ +
+
+ + + + + + diff --git a/package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_light/header.htm b/package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_light/header.htm new file mode 100644 index 0000000000..c23628ff28 --- /dev/null +++ b/package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_light/header.htm @@ -0,0 +1,301 @@ +<%# + Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI and Argon Template + + luci-theme-argon + Copyright 2019 Jerrykuku + + Have a bug? Please create an issue here on GitHub! + https://github.com/jerrykuku/luci-theme-argon/issues + + luci-theme-bootstrap: + Copyright 2008 Steven Barth + Copyright 2008-2016 Jo-Philipp Wich + Copyright 2012 David Menting + + MUI: + https://github.com/muicss/mui + + Agron Theme + https://demos.creative-tim.com/argon-dashboard/index.html + + Licensed to the public under the Apache License 2.0 +-%> + +<% + local sys = require "luci.sys" + local util = require "luci.util" + local http = require "luci.http" + local disp = require "luci.dispatcher" + local fs = require "nixio.fs" + local nutil = require "nixio.util" + + local boardinfo = util.ubus("system", "board") + + local request = disp.context.path + local request2 = disp.context.request + + local category = request[1] + local cattree = category and disp.node(category) + + local leaf = request2[#request2] + + local tree = disp.node() + local node = disp.context.dispatched + + local categories = disp.node_childs(tree) + + local c = tree + local i, r + + function glob(...) + local iter, code, msg = fs.glob(...) + if iter then + return nutil.consume(iter) + else + return nil, code, msg + end + end + + -- tag all nodes leading to this page + for i, r in ipairs(request) do + if c.nodes and c.nodes[r] then + c = c.nodes[r] + c._menu_selected = true + end + end + + -- send as HTML5 + http.prepare_content("text/html") + + local function nodeurl(prefix, name, query) + local u = url(prefix, name) + if query then + u = u .. http.build_querystring(query) + end + return pcdata(u) + end + + local function render_tabmenu(prefix, node, level) + if not level then + level = 1 + end + + local childs = disp.node_childs(node) + if #childs > 0 then + if level > 2 then + write('
    ') + end + + local selected_node + local selected_name + local i, v + + for i, v in ipairs(childs) do + local nnode = node.nodes[v] + if nnode._menu_selected then + selected_node = nnode + selected_name = v + end + + if level > 2 then + write('
  • %s
  • ' %{ + v, (nnode._menu_selected or (node.leaf and v == leaf)) and 'active' or '', + nodeurl(prefix, v, nnode.query), + striptags(translate(nnode.title)) + }) + end + end + + if level > 2 then + write('
') + end + + if selected_node then + render_tabmenu(prefix .. "/" .. selected_name, selected_node, level + 1) + end + end + end + + local function render_submenu(prefix, node) + local childs = disp.node_childs(node) + if #childs > 0 then + write('
    ') + + for i, r in ipairs(childs) do + local nnode = node.nodes[r] + local title = pcdata(striptags(translate(nnode.title))) + + write('
  • %s
  • ' %{ + title, + nodeurl(prefix, r, nnode.query), + title + }) + end + + write('
') + end + end + + local function render_topmenu() + local childs = disp.node_childs(cattree) + if #childs > 0 then + write('') + end + end + + local function render_changes() + -- calculate the number of unsaved changes + if tree.nodes[category] and tree.nodes[category].ucidata then + local ucichanges = 0 + local i, j + for i, j in pairs(require("luci.model.uci").cursor():changes()) do + ucichanges = ucichanges + #j + end + + if ucichanges > 0 then + write('%s: %d' %{ + url(category, 'uci/changes'), + http.urlencode(http.formvalue('redir') or table.concat(disp.context.request, "/")), + translate('Unsaved Changes'), + ucichanges + }) + end + end + end + + math.randomseed(os.time()) + + local bgcount = 0 + for f in ipairs(glob("/www/luci-static/argon_mc1/img/*")) do + bgcount = bgcount + 1 + end + + +-%> + + + + + <%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI + + + + + + + + + + + + + - LuCI"> + - LuCI"> + + + + + + + <% if node and node.css then %> + + <% end -%> + <% if css then %> + + <% end -%> + + + + + + +
+
+
+
+
+
+
+
+
+
+
+ <%=boardinfo.hostname or "?"%> ™ +
+ +
+
+ + + +
+
+
+
+ <% render_topmenu() %> +
+
+
+
+
+ + <%=boardinfo.hostname or "?"%> ™ +
+ <% render_changes() %> + +
+
+
+
+
+ <% if bgcount > 0 then %> + + <% end %> +
+
+ <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%> +
+

<%:No password set!%>

+

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

+ +
+ <%- end -%> + + + + <% if category then render_tabmenu(category, cattree) end %> diff --git a/package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_light_green/footer.htm b/package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_light_green/footer.htm new file mode 100644 index 0000000000..e63f26873d --- /dev/null +++ b/package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_light_green/footer.htm @@ -0,0 +1,63 @@ +<%# + Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material and Argon Template + + luci-theme-argon + Copyright 2019 Jerrykuku + + Have a bug? Please create an issue here on GitHub! + https://github.com/jerrykuku/luci-theme-argon/issues + + luci-theme-bootstrap: + Copyright 2008 Steven Barth + Copyright 2008-2016 Jo-Philipp Wich + Copyright 2012 David Menting + + MUI: + https://github.com/muicss/mui + + luci-theme-material: + https://github.com/LuttyYang/luci-theme-material/ + + Agron Theme + https://demos.creative-tim.com/argon-dashboard/index.html + + Login background + https://unsplash.com/ + + Font generate by Icomoon + https://icomoon.io/ + + Licensed to the public under the Apache License 2.0 +-%> + +<% + local ver = require "luci.version" + local disp = require "luci.dispatcher" + local request = disp.context.path + local category = request[1] + local tree = disp.node() + local categories = disp.node_childs(tree) +%> +
+ +
+
+ + + + + + diff --git a/package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_light_green/header.htm b/package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_light_green/header.htm new file mode 100644 index 0000000000..c23628ff28 --- /dev/null +++ b/package/lienol/luci-theme-argon-mod/luasrc/view/themes/argon_light_green/header.htm @@ -0,0 +1,301 @@ +<%# + Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI and Argon Template + + luci-theme-argon + Copyright 2019 Jerrykuku + + Have a bug? Please create an issue here on GitHub! + https://github.com/jerrykuku/luci-theme-argon/issues + + luci-theme-bootstrap: + Copyright 2008 Steven Barth + Copyright 2008-2016 Jo-Philipp Wich + Copyright 2012 David Menting + + MUI: + https://github.com/muicss/mui + + Agron Theme + https://demos.creative-tim.com/argon-dashboard/index.html + + Licensed to the public under the Apache License 2.0 +-%> + +<% + local sys = require "luci.sys" + local util = require "luci.util" + local http = require "luci.http" + local disp = require "luci.dispatcher" + local fs = require "nixio.fs" + local nutil = require "nixio.util" + + local boardinfo = util.ubus("system", "board") + + local request = disp.context.path + local request2 = disp.context.request + + local category = request[1] + local cattree = category and disp.node(category) + + local leaf = request2[#request2] + + local tree = disp.node() + local node = disp.context.dispatched + + local categories = disp.node_childs(tree) + + local c = tree + local i, r + + function glob(...) + local iter, code, msg = fs.glob(...) + if iter then + return nutil.consume(iter) + else + return nil, code, msg + end + end + + -- tag all nodes leading to this page + for i, r in ipairs(request) do + if c.nodes and c.nodes[r] then + c = c.nodes[r] + c._menu_selected = true + end + end + + -- send as HTML5 + http.prepare_content("text/html") + + local function nodeurl(prefix, name, query) + local u = url(prefix, name) + if query then + u = u .. http.build_querystring(query) + end + return pcdata(u) + end + + local function render_tabmenu(prefix, node, level) + if not level then + level = 1 + end + + local childs = disp.node_childs(node) + if #childs > 0 then + if level > 2 then + write('
    ') + end + + local selected_node + local selected_name + local i, v + + for i, v in ipairs(childs) do + local nnode = node.nodes[v] + if nnode._menu_selected then + selected_node = nnode + selected_name = v + end + + if level > 2 then + write('
  • %s
  • ' %{ + v, (nnode._menu_selected or (node.leaf and v == leaf)) and 'active' or '', + nodeurl(prefix, v, nnode.query), + striptags(translate(nnode.title)) + }) + end + end + + if level > 2 then + write('
') + end + + if selected_node then + render_tabmenu(prefix .. "/" .. selected_name, selected_node, level + 1) + end + end + end + + local function render_submenu(prefix, node) + local childs = disp.node_childs(node) + if #childs > 0 then + write('
    ') + + for i, r in ipairs(childs) do + local nnode = node.nodes[r] + local title = pcdata(striptags(translate(nnode.title))) + + write('
  • %s
  • ' %{ + title, + nodeurl(prefix, r, nnode.query), + title + }) + end + + write('
') + end + end + + local function render_topmenu() + local childs = disp.node_childs(cattree) + if #childs > 0 then + write('') + end + end + + local function render_changes() + -- calculate the number of unsaved changes + if tree.nodes[category] and tree.nodes[category].ucidata then + local ucichanges = 0 + local i, j + for i, j in pairs(require("luci.model.uci").cursor():changes()) do + ucichanges = ucichanges + #j + end + + if ucichanges > 0 then + write('%s: %d' %{ + url(category, 'uci/changes'), + http.urlencode(http.formvalue('redir') or table.concat(disp.context.request, "/")), + translate('Unsaved Changes'), + ucichanges + }) + end + end + end + + math.randomseed(os.time()) + + local bgcount = 0 + for f in ipairs(glob("/www/luci-static/argon_mc1/img/*")) do + bgcount = bgcount + 1 + end + + +-%> + + + + + <%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI + + + + + + + + + + + + + - LuCI"> + - LuCI"> + + + + + + + <% if node and node.css then %> + + <% end -%> + <% if css then %> + + <% end -%> + + + + + + +
+
+
+
+
+
+
+
+
+
+
+ <%=boardinfo.hostname or "?"%> ™ +
+ +
+
+ + + +
+
+
+
+ <% render_topmenu() %> +
+
+
+
+
+ + <%=boardinfo.hostname or "?"%> ™ +
+ <% render_changes() %> + +
+
+
+
+
+ <% if bgcount > 0 then %> + + <% end %> +
+
+ <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%> +
+

<%:No password set!%>

+

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

+ +
+ <%- end -%> + + + + <% if category then render_tabmenu(category, cattree) end %> diff --git a/package/lienol/luci-theme-argon-mod/root/etc/uci-defaults/30_luci-theme-argon-mod b/package/lienol/luci-theme-argon-mod/root/etc/uci-defaults/30_luci-theme-argon-mod new file mode 100755 index 0000000000..1e5a6776c1 --- /dev/null +++ b/package/lienol/luci-theme-argon-mod/root/etc/uci-defaults/30_luci-theme-argon-mod @@ -0,0 +1,11 @@ +#!/bin/sh +uci batch <<-EOF + set luci.themes.Argon_Light=/luci-static/argon_light + set luci.themes.Argon_Light_Green=/luci-static/argon_light_green + set luci.themes.Argon_Dark=/luci-static/argon_dark + set luci.themes.Argon_Dark_Purple=/luci-static/argon_dark_purple + delete luci.themes.Argon_MC1 + delete luci.themes.Argon_MC2 + commit luci +EOF +exit 0 diff --git a/package/lienol/luci-theme-bootstrap-mc/root/etc/uci-defaults/30_luci-theme-bootstrap-mc b/package/lienol/luci-theme-bootstrap-mc/root/etc/uci-defaults/30_luci-theme-bootstrap-mc old mode 100755 new mode 100644 diff --git a/package/lienol/luci-theme-bootstrap-mod/Makefile b/package/lienol/luci-theme-bootstrap-mod/Makefile new file mode 100644 index 0000000000..afec48ec20 --- /dev/null +++ b/package/lienol/luci-theme-bootstrap-mod/Makefile @@ -0,0 +1,15 @@ +# Copyright (C) 2018-2020 Lienol +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=Bootstrap Mod Theme By Lienol +LUCI_DEPENDS:= +PKG_VERSION:=1.0 +PKG_RELEASE:=43-20191221 + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_blue/bg.jpg b/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_blue/bg.jpg new file mode 100644 index 0000000000..c8b989fd73 Binary files /dev/null and b/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_blue/bg.jpg differ diff --git a/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_blue/cascade.css b/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_blue/cascade.css new file mode 100644 index 0000000000..75d5ec6244 --- /dev/null +++ b/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_blue/cascade.css @@ -0,0 +1,1541 @@ +html, +body { + height: 100%; +} + +body { + background: #ffffff; + color: #333; + font-family: Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.8; + margin: 0; + padding-top: 60px; + margin: unset; +} + +a { + color: #118af3; + text-decoration: none; + outline: 0; +} + +a:hover { + opacity: 1; +} + +h1, +h2, +h3, +h4, +h5, +h6, +p, +.cbi-map-descr, +.cbi-section-descr { + color: #19a4e6; + margin-top: 0; + margin-bottom: 10px; +} + +ul, +ol { + margin: 0; + padding: 0; + list-style: none; +} + +tr, +.tr { + display: table-row; +} + +legend { + color: #19a4e6; + font-size: 18px; + font-weight: bold; + padding: 0 0 3px; +} + +.left { + text-align: left !important; +} + +.right { + text-align: right !important; +} + +.center { + text-align: center !important; +} + +.top { + vertical-align: top !important; +} + +.middle { + vertical-align: middle !important; +} + +.bottom { + vertical-align: bottom !important; +} + +.pull-left { + float: left !important; +} + +.pull-right { + float: right !important; +} + +.inline { + display: inline; +} + +.hidden { + display: none; +} + + +/* Style */ + +.container:first-child { + min-height: 40px; +} + +.container { + max-width: 1200px; + margin: 0 auto; +} + +/* Header */ + +header { + font-size: 15px; + position: fixed; + top: 0; + left: 0; + right: 0; + background: #34aee8; + box-shadow: 0 2px 2px rgba(0, 0, 0, .1); + z-index: 100; + border-bottom: 3px solid #19a4e6; +} + +.brand { + float: left; + color: #ffffff; + font-size: 24px; + font-weight: 700; + line-height: 40px; + margin-right: 20px; + position: absolute; + left: 0; + margin-left: 20px; +} + + +/* .brand { display:none; } */ + +.brand:hover { + opacity: 1; +} + +.nav li { + float: left; +} + +.nav a { + display: block; + color: #fff; + line-height: 40px; + padding: 0 15px; +} + +.nav a:hover {} + + +/* Dropdown */ + +.dropdown { + position: relative; +} + +.dropdown:hover { + background-color: #0088cc; +} + +.dropdown:hover .dropdown-menu { + display: block; +} + +.dropdown-menu { + display: none; + position: absolute; + top: 40px; + background: #34aee8; + border-radius: 5px; + padding: 5px 0px; + z-index: 100; +} + +.dropdown-menu:before { + content: ''; + position: absolute; + top: -6px; + left: 27px; + border-bottom: 6px solid #00aaff; + border-left: 7px solid transparent; + border-right: 7px solid transparent; +} + +.dropdown-menu a { + color: #fff; + line-height: 30px; + min-width: 160px; + padding: 0 20px; + font-size: 15px; +} + +.dropdown-menu a:hover { + background: #118af3; + /* color: #3fc3ef; */ +} + +.cbi-dropdown { + display: inline-block; + width: 210px; + height: 30px; + padding: 4px; + font-size: 13px; + line-height: 18px; + color: #808080; + border: 1px solid #ccc; + border-radius: 3px; + box-sizing: border-box; +} + +.cbi-dropdown { + border: 1px solid #ccc; + border-radius: 3px; + display: inline-flex; + padding: 0; + cursor: pointer; + height: auto; + background: linear-gradient(#fff 0%, #e9e8e6 100%); + position: relative; + color: #404040; +} + +.cbi-dropdown { + /* min-width: 210px; */ + max-width: 400px; + width: auto; +} + +.cbi-dropdown:focus { + outline: 2px solid #4b6e9b; +} + +.cbi-dropdown>ul { + margin: 0 !important; + padding: 0; + list-style: none; + overflow-x: hidden; + overflow-y: auto; + display: flex; + width: 100%; +} + +.cbi-dropdown>ul.preview { + display: none; +} + +.cbi-dropdown>.open, +.cbi-dropdown>.more { + flex-grow: 0; + flex-shrink: 0; + display: flex; + flex-direction: column; + justify-content: center; + text-align: center; + line-height: 2em; + padding: 0 .25em; +} + +.cbi-dropdown>.more, +.cbi-dropdown>ul>li[placeholder] { + color: #777; + font-weight: bold; + text-shadow: 1px 1px 0px #fff; + display: none; +} + +.cbi-dropdown>ul>li { + display: none; + padding: .25em; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + flex-shrink: 1; + flex-grow: 1; + align-items: center; + align-self: center; + /* color: #404040; */ + min-height: 20px; +} + +.cbi-dropdown>ul>li .hide-open { + display: block; + display: initial; +} + +.cbi-dropdown>ul>li .hide-close { + display: none; +} + +.cbi-dropdown>ul>li[display]:not([display="0"]) { + border-left: 1px solid #ccc; +} + +.cbi-dropdown[empty]>ul { + max-width: 1px; +} + +.cbi-dropdown>ul>li>form { + display: none; + margin: 0; + padding: 0; + pointer-events: none; +} + +.cbi-dropdown>ul>li img { + vertical-align: middle; + margin-right: .25em; +} + +.cbi-dropdown>ul>li>form>input[type="checkbox"] { + margin: 0; +} + +.cbi-dropdown>ul>li input[type="text"] { + height: 20px; +} + +.cbi-dropdown[open] { + position: relative; +} + +.cbi-dropdown[open]>ul.dropdown { + display: block; + background: #f6f6f5; + border: 1px solid #918e8c; + box-shadow: 0 0 4px #918e8c; + position: absolute; + z-index: 1000; + max-width: none; + min-width: 100%; + width: auto; +} + +.cbi-dropdown>ul>li[display], +.cbi-dropdown[open]>ul.preview, +.cbi-dropdown[open]>ul.dropdown>li, +.cbi-dropdown[multiple]>ul>li>label, +.cbi-dropdown[multiple][open]>ul.dropdown>li, +.cbi-dropdown[multiple][more]>.more, +.cbi-dropdown[multiple][empty]>.more { + flex-grow: 1; + display: flex; +} + +.cbi-dropdown[empty]>ul>li, +.cbi-dropdown[optional][open]>ul.dropdown>li[placeholder], +.cbi-dropdown[multiple][open]>ul.dropdown>li>form { + display: block; +} + +.cbi-dropdown[open]>ul.dropdown>li .hide-open { + display: none; +} + +.cbi-dropdown[open]>ul.dropdown>li .hide-close { + display: block; + display: initial; +} + +.cbi-dropdown[open]>ul.dropdown>li { + border-bottom: 1px solid #ccc; +} + +.cbi-dropdown[open]>ul.dropdown>li[selected] { + background: #b0d0f0; +} + +.cbi-dropdown[open]>ul.dropdown>li.focus { + background: linear-gradient(90deg, #a3c2e8 0%, #84aad9 100%); +} + +.cbi-dropdown[open]>ul.dropdown>li:last-child { + margin-bottom: 0; + border-bottom: none; +} + +.cbi-dropdown[disabled] { + pointer-events: none; + opacity: .6; +} + + +/* Label */ + +.label { + border-radius: 10px !important; + display: inline-block; + background: #bbb; + border-bottom: 2px solid rgba(0, 0, 0, .05); + border-radius: 4px; + color: #fff; + font-size: 14px; + line-height: 24px; + text-transform: uppercase; + margin-top: 6px; + padding: 2px 9px; + cursor: pointer; +} + +.label.success { + background: #118af3; +} + +.label.notice { + background: #118af3; +} + +.label.important { + background: #f00; +} + +.label.warning { + background: #fc0; +} + + +/* Main */ + +h2 a { + color: #333; +} + +h2 a:hover { + opacity: 1; +} + +h2+.cbi-map-descr { + margin-top: -10px; +} + +.alert-message { + position: relative; + padding: 15px; + margin-bottom: 10px; + background: #b4e7ff; + /* border: 1px solid rgba(0, 0, 0, .1); + border-width: 2px 0; */ + border-radius: 2px; +} + +.alert-message>h4, +p { + margin: 0; +} + +.error, +.errorbox { + display: inline; +} + +.error { + color: #f00; +} + +.errorbox { + color: #3b3; +} + +#maincontainer { + box-shadow: 0 0 2px rgba(0, 0, 0, .3); + border-radius: 4px; + width: 500px; + margin: 120px auto 0; + padding: 30px; +} + +#syslog { + color: #111; + width: 100%; +} + + +/* Change List */ + +.uci-change-legend { + padding-top: 15px; +} + +.uci-change-legend-label { + float: left; + margin-right: 100px; +} + +.uci-change-legend-label>ins, +.uci-change-legend-label>del, +.uci-change-legend-label>var { + float: left; + width: 10px; + height: 10px; + margin-top: 3px; + margin-right: 6px; +} + +.uci-change-list { + font-family: monospace; +} + +.uci-change-list ins, +.uci-change-legend-label ins, +.uci-change-list del, +.uci-change-legend-label del, +.uci-change-list var, +.uci-change-legend-label var { + display: block; + text-decoration: none; + padding: 2px; +} + +.uci-change-list ins, +.uci-change-legend-label ins { + background: #cfc; + border: 2px solid #4f4; +} + +.uci-change-list del, +.uci-change-legend-label del { + background: #fcc; + border: 2px solid #f00; +} + +.uci-change-list var, +.uci-change-legend-label var { + background: #f2f2f2; + border: 2px solid #ccc; +} + +.uci-change-list var ins, +.uci-change-list var del { + border: 0; + white-space: pre; + padding: 0; +} + +.uci-change-legend-label var ins, +.uci-change-legend-label var del { + border: 0; + line-height: 6px; +} + + +/* Tabs */ + +.tabs, +.cbi-tabmenu { + border-bottom: 1.5px solid #34aee8; + margin-bottom: 20px; +} + +.tabs li, +.cbi-tabmenu li { + display: inline-block; +} + +.tabs a, +.cbi-tabmenu a { + display: block; + color: #19a4e6; + line-height: 34px; + margin-bottom: -2px; + margin-right: 20px; + padding: 0 3px; +} + +.active a, +.cbi-tab a { + border-bottom: 2px solid #111; + color: #111; +} + + +/* Fieldset */ + +fieldset { + border: 0px; + margin: 10px 0; + padding: 0; +} + +fieldset fieldset { + margin: 0; +} + +.cbi-value { + margin-bottom: 1em; + zoom: 1; + clear: both; +} + +table .cbi-value-field, +.table .cbi-value-field { + display: table-cell; +} + +.cbi-value-title { + /* white-space: nowrap; + overflow: hidden; + text-overflow: clip; */ + display: table-cell; + padding-top: 0.4em; + line-height: 1.2em; + float: left; + width: 13em; + margin-right: 1.5em; + text-align: right; + color: #404040; +} + +.cbi-value-field { + color: #811; + display: table-cell; +} + +.cbi-section-table-cell { + white-space: nowrap; +} + +.cbi-section-create { + margin: -3px; + display: inline-flex; + align-items: center; +} + +.cbi-section-create>* { + margin: 3px; + flex: 1 1 auto; +} + + +/* Table */ + + +/* .cbi-section table tbody tr:nth-child(odd) { background-color: #fdfdfd; } */ + +table, +.table { + width: 100%; + display: table; + margin: 0 0 10px !important; + border-radius: 5px; + /* border: 1px solid #a9b1bb26; */ + border-collapse: collapse; + position: relative; +} + + +/* table tr:first-child, .table .tr:first-child { border-top: 1px solid #b0e6b9; } */ + + +/* table tr, .table .tr { border-bottom: 1px solid #b0e6b9; } */ + +table th, +table td, +.table .th, +.table .td { + color: #811; + padding: 5px 3px !important; +} + +table tr+tr td, +.table .tr+.tr .td { + border-top: 1px solid #a9b1bb26; +} + +table th, +.table .th { + text-align: left; + font-weight: bold; +} + +table td:first-child, +.table .td:first-child { + color: #127; +} + +.table[width="33%"], +.th[width="33%"], +.td[width="33%"] { + width: 33%; +} + +.table[width="100%"], +.th[width="100%"], +.td[width="100%"] { + width: 100%; +} + +.table .th, +.table .td { + display: table-cell; + vertical-align: middle; +} + +.table .tr.placeholder { + height: calc(3em + 20px); +} + +.table .tr.placeholder>.td { + position: absolute; + left: 0; + right: 0; + bottom: 0; + text-align: center; + line-height: 3em; +} + +.td.cbi-section-actions>* { + display: flex; +} + +.td.cbi-section-actions>*>*, +.td.cbi-section-actions>*>form>* { + flex: 1 1 4em; + margin: 0 1px; +} + +.td.cbi-section-actions>*>.cbi-button-up, +.cbi-input-up { + background: unset; +} + +.td.cbi-section-actions>*>.cbi-button-down, +.cbi-input-down { + background: unset; +} + +#cbi-network .tr, +#cbi-wireless .tr, +.tr .tr:first-child, +#cbi-network tr, +#cbi-wireless tr, +tr tr:first-child { + border-top: 0; +} + +#cbi-network .tr, +#cbi-wireless .tr, +.tr .tr, +#cbi-network tr, +#cbi-wireless tr, +tr tr { + border-bottom: 0; +} + +#cpu_free, +#memtotal, +#memfree, +#memcache, +#membuff, +#conns, +#swaptotal, +#swapfree { + line-height: 18px; +} + +#cpu_free>div, +#memtotal>div, +#memfree>div, +#memcache>div, +#membuff>div, +#conns>div, +#swaptotal>div, +#swapfree>div { + border: 1.5px solid #bbb !important; + border-radius: 5px; + width: 240px !important; +} + +#cpu_free>div>div, +#memtotal>div>div, +#memfree>div>div, +#memcache>div>div, +#membuff>div>div, +#conns>div>div, +#swaptotal>div>div, +#swapfree>div>div { + background: #00adff7a !important; + height: 18px !important; + border-radius: 3px; +} + + +/* Form */ + +input, +textarea, +select { + display: inline-block; + width: 16em; + padding: 0.5em; + border: 1px solid #118af3; + border-radius: 5px; + box-sizing: border-box; + color: #111; + font: inherit; + line-height: 1em; +} + +table.cbi-section-table input, +table.cbi-section-table textarea, +table.cbi-section-table select, +.table.cbi-section-table input, +.table.cbi-section-table textarea, +.table.cbi-section-table select { + width: auto; +} + +#cbi-network-switch_vlan select, +#cbi-firewall-zone select, +#cbi-firewall-redirect select { + width: auto; +} + +input:active, +input:focus { + outline: 0; + border-color: #118af3; +} + +input[type=file]:focus, +input[type=checkbox]:focus, +textarea:focus, +select:focus { + outline: 0; +} + +input[type=button], +input[type=reset], +input[type=submit], +button { + width: auto !important; +} + +input[type=checkbox], +input[type=radio] { + width: auto; + margin: 0; + vertical-align: middle; + cursor: pointer; +} + +input[type=file] { + padding: 0; + border: 0; +} + +.cbi-input-invalid, +.cbi-value-error input { + color: #f00; + border-color: #f00 !important; +} + +.cbi-image-button { + margin: 10px 8px; + vertical-align: middle; +} + +.uneditable-input { + background: #fafafa; + border-color: #f2f2f2; + color: #ccc; + cursor: not-allowed; +} + +.uneditable-input:active, +.uneditable-input:focus { + border-color: #f2f2f2; +} + +.cbi-value-description { + /* display: inline; */ + background-image: url(/luci-static/resources/cbi/help.gif); + /* background-position-x: 0px; + background-position-y: 1px; */ + background-position: 0em 0.3em; + background-repeat: no-repeat; + padding: 0 1.2rem; +} + +.cbi-value-description img { + display: none; + vertical-align: sub; +} + +.cbi-page-actions { + text-align: right; + padding: 10px 0px; +} + +.cbi-page-actions.right { + float: inherit; +} + + +/* Button */ + +.cbi-button, +button { + border-radius: 6px !important; + display: inline-block; + background: #fff; + border: 2px solid #99d; + border-radius: 2px; + box-shadow: 0 2px 2px rgba(0, 0, 0, .05); + color: #333; + line-height: 16px; + padding: 4px 8px; + cursor: pointer; + margin-left: 0.2em; +} + +.cbi-button:active, +.cbi-button:focus button:active, +button:focus { + border-color: #bbb; +} + +.cbi-button-up, +.cbi-input-up { + background-position: center; + background-image: url('../resources/cbi/up.gif'), linear-gradient(#ffffff, #ffffff 50%, #e6e6e6); + background-repeat: no-repeat; +} + +.cbi-button-down, +.cbi-input-down { + background-position: center; + background-image: url('../resources/cbi/down.gif'), linear-gradient(#ffffff, #ffffff 50%, #e6e6e6); + background-repeat: no-repeat; +} + +.cbi-button-add, +.cbi-input-add { + background: #19a4e6; + border-color: #19a4e6; + color: #fff; +} + +.cbi-button-add:active, +.cbi-button-add:focus, +.cbi-input-add:active, +.cbi-input-add:focus { + border-color: #19a4e6; + opacity: .8; +} + +.cbi-button-remove, +.cbi-input-remove, +.cbi-section-remove input { + background: #c00; + border-color: #c00; + color: #fff; +} + +.cbi-button-remove:active, +.cbi-button-remove:focus, +.cbi-input-remove:active, +.cbi-input-remove:focus, +.cbi-section-remove input:active, +.cbi-section-remove input:focus { + border-color: #c00; + opacity: .8; +} + +.cbi-button-reload, +.cbi-input-reload { + background: rgb(148, 143, 225); + border-color: rgb(148, 143, 225); + color: #fff; +} + +.cbi-button-reload:active, +.cbi-button-reload:focus, +.cbi-input-reload:active, +.cbi-input-reload:focus { + border-color: rgb(148, 143, 225); + opacity: .8; +} + +.cbi-button-reset, +.cbi-input-reset { + background: #6bde84; + border-color: #6bde84; + color: #fff; +} + +.cbi-button-reset:active, +.cbi-button-reset:focus, +.cbi-input-reset:active, +.cbi-input-reset:focus { + border-color: #6bde84; + opacity: .8; +} + +.cbi-button-edit, +.cbi-input-edit { + background: #ff7700; + border-color: #ff7700; + color: #fff; +} + +.cbi-button-edit:active, +.cbi-button-edit:focus, +.cbi-input-edit:active, +.cbi-input-edit:focus { + border-color: #ff7700; + opacity: .8; +} + +.cbi-button-apply, +.cbi-input-apply { + background: rgb(0, 171, 232); + border-color: rgb(0, 171, 232); + color: #fff; +} + +.cbi-button-apply:active, +.cbi-button-apply:focus, +.cbi-input-apply:active, +.cbi-input-apply:focus { + border-color: rgb(0, 171, 232); + opacity: .8; +} + +.cbi-button-save, +.cbi-input-save { + background: rgb(148, 143, 225); + border-color: rgb(148, 143, 225); + color: #fff; +} + +.cbi-button-save:active, +.cbi-button-save:focus, +.cbi-input-save:active, +.cbi-input-save:focus { + border-color: rgb(148, 143, 225); + opacity: .8; +} + + +/* Input Error */ + +.cbi-section-error { + background: #fee; + border: 2px solid #f00; + padding: 10px; +} + +.cbi-section-error ul { + padding-left: 20px; +} + +.cbi-section-error ul li { + color: #f00; + list-style: disc; +} + + +/* Interface */ + +.ifacebox { + text-align: center; + margin-right: 60px; +} + +.ifacebox .ifacebox-head { + border-bottom: 1px solid #ccc; + padding: 2px; + background: #eee; +} + +.ifacebox .ifacebox-head.active { + background: #85d8ff; +} + +.ifacebox .ifacebox-body { + border: 2px solid #f2f2f2; + border-top: 0; + border-radius: 0 0 4px 4px; + padding: 2px 10px; +} + +.network-status-table .ifacebox-body { + display: flex; + flex-direction: column; + height: 100%; + text-align: left; +} + +.network-status-table .ifacebox { + margin: .5em; + flex-grow: 1; +} + +.ifacebox .ifacebox-body { + padding: .25em; +} + +.ifacebox { + background-color: #fff; + border: 1px solid #ccc; + margin: 0 10px; + text-align: center; + white-space: nowrap; + background-image: linear-gradient(#fff, #fff 25%, #f9f9f9); + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + border-radius: 4px; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + display: inline-flex; + flex-direction: column; + line-height: 1.2em; + min-width: 100px; +} + +.ifacebadge { + display: inline-block; + flex-direction: row; + white-space: nowrap; + background-color: #fff; + border: 1px solid #ccc; + padding: 2px; + background-image: linear-gradient(#fff, #fff 25%, #f9f9f9); + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + border-radius: 4px; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + cursor: default; + line-height: 1.2em; +} + +.ifacebadge.large, +.network-status-table .ifacebox-body .ifacebadge { + display: inline-flex; + flex: 1; + padding: .25em; + min-width: 220px; + margin: .125em; + float: left; +} + +.ifacebadge img { + width: 16px; + height: 16px; + vertical-align: middle; +} + +.ifacebadge>*, +.ifacebadge.large>* { + margin: 0 .125em; +} + +.ifacebadge>*, +.ifacebadge.large>* { + margin: 0 .125em; +} + +.network-status-table { + display: flex; + flex-wrap: wrap; +} + +.cbi-tooltip { + position: absolute; + z-index: 1000; + left: -10000px; + box-shadow: 0 0 2px #ccc; + border-radius: 3px; + background: #fff; + white-space: pre; + opacity: 0; + transition: opacity .25s ease-in; + padding: 2px 5px; +} + +.cbi-tooltip-container { + /* cursor: help; */ +} + + +/* Firewall */ + +.zonebadge { + display: inline-block; + border-radius: 4px; + color: #333; + white-space: nowrap; + padding: 0 8px; + cursor: pointer; +} + +.zonebadge em, +.zonebadge strong { + margin: 0 5px; +} + +.zonebadge-empty { + border: 2px dashed #ddd; + color: #ddd; + font-style: italic; +} + +.zone-forwards { + display: flex; + flex-wrap: wrap; +} + +.zone-forwards .zone-src, +.zone-forwards .zone-dest { + display: flex; + flex-direction: column; +} + +.zone-forwards>span { + flex-basis: 10%; + text-align: center; +} + +.zone-forwards>* { + flex: 1 1 40%; + padding: 1px; +} + + +/* Footer */ + +footer { + border-top: 2px solid #34aee8; + color: #111; + text-align: center; + padding: 10px 0; + margin-top: 10px; +} + +footer a { + color: #118af3; +} + +footer a:hover { + color: #fff; +} + + +/* diy */ + +#wan4_i, +#wan6_i { + vertical-align: top; + width: 50px !important; +} + +/* login */ +body.node-main-login { + background: url(bg.jpg); + background-repeat: no-repeat; + background-size: 100% 100%; + -moz-background-size: 100% 100%; + padding-top: unset; +} + +body.node-main-login>header { + background: none; + border-bottom: none; +} + +body.node-main-login .alert-message { + z-index: 999; +} + +.node-main-login>.container>form { + width: 20rem; + display: inline-block; + padding: 1rem 1rem; + border-radius: .375rem; + text-align: center; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +.node-main-login>.container>form .errorbox { + color: red; +} + +.node-main-login>.container>form>.cbi-map>h2 { + width: 100px; + height: 100px; + color: #fff; + text-align: center; + letter-spacing: 4px; + display: block; + margin: -100px auto 15px auto; + padding: 0; + text-indent: -500px; + overflow: hidden; + border-radius: 60px; + /* border: #118af3 3px solid; */ + background-image: url(wifi.png); + background-size: cover; + /* box-shadow: 0 4px 20px 0px rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(156, 39, 176, 0.4); */ +} + +.node-main-login>.container>form input[name='luci_username'], +.node-main-login>.container>form input[name='luci_password'] { + background: unset; + color: #000; +} + +.node-main-login>.container>form>.cbi-map>.cbi-section { + display: inline-block; +} + +.node-main-login>.container>footer { + position: absolute; + top: 40%; + left: 50%; + transform: translate(-50%, -50%); + width: 100%; + margin-top: 60px; + display: none; +} + +.node-main-login>.container>form .cbi-page-actions { + text-align: center !important; +} + +/* luci 19 */ +body.modal-overlay-active { + overflow: hidden; + height: 100vh; +} + +body.modal-overlay-active #modal_overlay { + visibility: visible; + left: 0; + right: 0; + opacity: 1; +} + +body.modal-overlay-active #modal_overlay>.modal { + align-items: center; + box-shadow: 0 0 3px #444; + display: flex; + flex-wrap: wrap; + max-height: unset; + max-width: unset; + min-height: 32px; + min-width: 270px; + background: #b4e7ff !important; + border-radius: 3px; + padding: 1em; + margin: 0; + position: absolute; + top: 15%; + left: 50%; + transform: translate(-50%, -15%); +} + +#modal_overlay { + visibility: hidden; + position: fixed; + top: 0; + bottom: 0; + left: -10000px; + right: 10000px; + background: rgba(0, 0, 0, 0.7); + z-index: 900; + overflow-y: scroll; + -webkit-overflow-scrolling: touch; + transition: opacity .125s ease-in; + opacity: 0; +} + +#modal_overlay>.modal.uci-dialog, +#modal_overlay>.modal.cbi-modal { + max-width: 900px; +} + +/*.modal.alert-message.notice { + position: absolute; + padding: 15px; + margin-bottom: 10px; + background: #b4e7ff; + border: 1px solid rgba(0, 0, 0, .1); + border-width: 2px 0; +}*/ + +.modal>* { + flex-basis: 100%; + line-height: normal; + margin-bottom: .5em; + max-width: 100%; +} + +#modal_overlay .modal>* { + flex-basis: 100%; + line-height: normal; + margin-bottom: .5em; +} + +[data-tab-title] { + height: 0; + opacity: 0; + overflow: hidden; +} + +[data-tab-active="true"], +.cbi-filebrowser.open { + height: auto; + opacity: 1; + overflow: visible; + transition: opacity .25s ease-in; +} + +.tabs>li:not(.active), +.cbi-tabmenu>.cbi-tab-disabled { + color: #999; +} + +.cbi-dynlist { + height: auto; + min-height: 30px; + display: inline-flex; + flex-direction: column; +} + +.cbi-dropdown:not(.btn):not(.cbi-button), +.cbi-dynlist { + min-width: 210px; + max-width: 400px; + width: auto; + background: white; + border: 1px solid #118af3; + border-radius: 5px; + box-sizing: border-box; + padding: 0.3em !important; +} + +.cbi-dynlist>.item { + margin-bottom: 4px; + box-shadow: 0 0 2px #ccc; + background: #fff; + border: 1px solid #118af3; + border-radius: 3px; + position: relative; + pointer-events: none; + padding: 2px 2em 2px 4px; +} + +.cbi-dynlist>.item::after { + content: "×"; + position: absolute; + display: inline-flex; + align-items: center; + top: -1px; + right: -1px; + bottom: -1px; + border: 1px solid #ccc; + border-radius: 0 3px 3px 0; + font-weight: 700; + color: #c44; + pointer-events: auto; + padding: 0 6px; +} + +.cbi-dynlist>.add-item, +.td.cbi-section-actions>* { + display: flex; +} + +.cbi-dynlist>.add-item>input, +.cbi-dynlist>.add-item>button { + flex: 1 1 auto; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.cbi-dropdown.btn>.open, +.cbi-dropdown.cbi-button>.open { + margin-left: .5em; + border-left: 1px solid; + padding: 0 .5em; +} + +.cbi-dropdown.btn>ul:not(.dropdown), +.cbi-dropdown.cbi-button>ul:not(.dropdown) { + margin: 0 0 0 13px !important; +} + +.btn.primary, +.cbi-button-action.important, +.cbi-page-actions .cbi-button-apply, +.cbi-section-actions .cbi-button-edit { + color: #fff; +} + +.cbi-dropdown { + display: inline-flex !important; + cursor: pointer; + height: auto; + position: relative; + padding: 0 !important; +} + +.cbi-progressbar { + border: 1px solid #ccc; + border-radius: 3px; + position: relative; + min-width: 170px; + height: 20px; + background: #f9f9f9; + margin: 4px 0; +} + +.cbi-progressbar>div { + background: #85d8ff; + height: 100%; + transition: width .25s ease-in; + width: 0%; +} + +.cbi-progressbar::after { + position: absolute; + bottom: 0; + top: 0; + right: 0; + left: 0; + text-align: center; + text-shadow: 0 0 2px #fff; + content: attr(title); + white-space: pre; + overflow: hidden; + text-overflow: ellipsis; +} \ No newline at end of file diff --git a/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_blue/favicon.ico b/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_blue/favicon.ico new file mode 100644 index 0000000000..77a138ba0c Binary files /dev/null and b/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_blue/favicon.ico differ diff --git a/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_blue/html5.js b/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_blue/html5.js new file mode 100644 index 0000000000..1ec510f2a4 --- /dev/null +++ b/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_blue/html5.js @@ -0,0 +1,3 @@ +// HTML5 Shiv v3 | @jon_neal @afarkas @rem | MIT/GPL2 Licensed +// Uncompressed source: https://github.com/aFarkas/html5shiv +(function(a,b){function f(a){var c,d,e,f;b.documentMode>7?(c=b.createElement("font"),c.setAttribute("data-html5shiv",a.nodeName.toLowerCase())):c=b.createElement("shiv:"+a.nodeName);while(a.firstChild)c.appendChild(a.childNodes[0]);for(d=a.attributes,e=d.length,f=0;f7?e[g][e[g].length-1]=e[g][e[g].length-1].replace(d,'$1font[data-html5shiv="$2"]'):e[g][e[g].length-1]=e[g][e[g].length-1].replace(d,"$1shiv\\:$2"),e[g]=e[g].join("}");return e.join("{")}var c=function(a){return a.innerHTML="",a.childNodes.length===1}(b.createElement("a")),d=function(a,b,c){return b.appendChild(a),(c=(c?c(a):a.currentStyle).display)&&b.removeChild(a)&&c==="block"}(b.createElement("nav"),b.documentElement,a.getComputedStyle),e={elements:"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video".split(" "),shivDocument:function(a){a=a||b;if(a.documentShived)return;a.documentShived=!0;var f=a.createElement,g=a.createDocumentFragment,h=a.getElementsByTagName("head")[0],i=function(a){f(a)};c||(e.elements.join(" ").replace(/\w+/g,i),a.createElement=function(a){var b=f(a);return b.canHaveChildren&&e.shivDocument(b.document),b},a.createDocumentFragment=function(){return e.shivDocument(g())});if(!d&&h){var j=f("div");j.innerHTML=["x"].join(""),h.insertBefore(j.lastChild,h.firstChild)}return a}};e.shivDocument(b),a.html5=e;if(c||!a.attachEvent)return;a.attachEvent("onbeforeprint",function(){if(a.html5.supportsXElement||!b.namespaces)return;b.namespaces.shiv||b.namespaces.add("shiv");var c=-1,d=new RegExp("^("+a.html5.elements.join("|")+")$","i"),e=b.getElementsByTagName("*"),g=e.length,j,k=i(h(function(a,b){var c=[],d=a.length;while(d)c.unshift(a[--d]);d=b.length;while(d)c.unshift(b[--d]);c.sort(function(a,b){return a.sourceIndex-b.sourceIndex}),d=c.length;while(d)c[--d]=c[d].styleSheet;return c}(b.getElementsByTagName("style"),b.getElementsByTagName("link"))));while(++c.pull-right>* { + position: absolute; + top: 1rem; + right: 0.5rem; + cursor: pointer; + } +} + +@media screen and (max-width: 480px) { + body { + font-size: 12px; + } + header { + font-size: 13px; + } + legend { + font-size: 14px; + } + .dropdown-menu a { + font-size: 13px; + min-width: 130px; + padding: 0 15px; + } + .mobile-hide { + display: none; + } + #maincontent.container { + padding: 0px 10px; + } + div.cbi-section, fieldset { + min-width: inherit; + overflow-x: auto; + overflow-y: hidden; + } + .cbi-value { + } + .cbi-value-title { + width: 30%; + min-width: 0rem !important; + margin-right: 1em; + /* text-align: left; + padding-left: 1em; */ + } + .cbi-value-field { + width: 55%; + } + .cbi-value-description { + width: 75%; + display: inline-table; + padding: 1px 1.2rem; + background-position-y: 3px; + } + .cbi-value-field .cbi-input-select, + .cbi-value input[type="password"], + .cbi-value input[type="text"] { + min-width: unset; + /* width: 95%; */ + } +} + +@media screen and (max-device-width: 600px) { + #maincontent.container { + margin-top: 30px; + } +} + +@media screen and (max-device-width: 360px) { + #maincontent.container { + margin-top: 30px; + } +} + +@media screen and (max-device-width: 200px) { + #maincontent.container { + margin-top: 30px; + } +} \ No newline at end of file diff --git a/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_blue/wifi.png b/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_blue/wifi.png new file mode 100644 index 0000000000..629594f824 Binary files /dev/null and b/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_blue/wifi.png differ diff --git a/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_purple/bg.jpg b/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_purple/bg.jpg new file mode 100644 index 0000000000..c8b989fd73 Binary files /dev/null and b/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_purple/bg.jpg differ diff --git a/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_purple/cascade.css b/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_purple/cascade.css new file mode 100644 index 0000000000..e1fdc11947 --- /dev/null +++ b/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_purple/cascade.css @@ -0,0 +1,1545 @@ +html, +body { + height: 100%; +} + +body { + background: #ffffff; + color: #333; + font-family: Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.8; + margin: 0; + padding-top: 60px; + margin: unset; +} + +a { + color: #726bda; + text-decoration: none; + outline: 0; +} + +a:hover { + opacity: 1; +} + +h1, +h2, +h3, +h4, +h5, +h6, +p, +.cbi-map-descr, +.cbi-section-descr { + color: #726bda; + margin-top: 0; + margin-bottom: 10px; +} + +ul, +ol { + margin: 0; + padding: 0; + list-style: none; +} + +tr, +.tr { + display: table-row; +} + +legend { + color: #726bda; + font-size: 18px; + font-weight: bold; + padding: 0 0 3px; +} + +.left { + text-align: left !important; +} + +.right { + text-align: right !important; +} + +.center { + text-align: center !important; +} + +.top { + vertical-align: top !important; +} + +.middle { + vertical-align: middle !important; +} + +.bottom { + vertical-align: bottom !important; +} + +.pull-left { + float: left !important; +} + +.pull-right { + float: right !important; +} + +.inline { + display: inline; +} + +.hidden { + display: none; +} + + +/* Style */ + +.container:first-child { + min-height: 40px; +} + +.container { + max-width: 1200px; + margin: 0 auto; +} + +/* Header */ + +header { + font-size: 15px; + position: fixed; + top: 0; + left: 0; + right: 0; + background: #948fe1; + box-shadow: 0 2px 2px rgba(0, 0, 0, .1); + z-index: 100; + border-bottom: 3px solid #726bda; +} + +.brand { + float: left; + color: #ffffff; + font-size: 24px; + font-weight: 700; + line-height: 40px; + margin-right: 20px; + position: absolute; + left: 0; + margin-left: 20px; +} + + +/* .brand { display:none; } */ + +.brand:hover { + opacity: 1; +} + +.nav li { + float: left; +} + +.nav a { + display: block; + color: #fff; + line-height: 40px; + padding: 0 15px; +} + +.nav a:hover {} + + +/* Dropdown */ + +.dropdown { + position: relative; +} + +.dropdown:hover { + background-color: #726bda; +} + +.dropdown:hover .dropdown-menu { + display: block; +} + +.dropdown-menu { + display: none; + position: absolute; + top: 40px; + background: #948fe1; + border-radius: 5px; + padding: 5px 0px; + z-index: 100; +} + +.dropdown-menu:before { + content: ''; + position: absolute; + top: -6px; + left: 27px; + border-bottom: 6px solid #00aaff; + border-left: 7px solid transparent; + border-right: 7px solid transparent; +} + +.dropdown-menu a { + color: #fff; + line-height: 30px; + min-width: 160px; + padding: 0 20px; + font-size: 15px; +} + +.dropdown-menu a:hover { + background: #726bda; + /* color: #3fc3ef; */ +} + +.cbi-dropdown { + display: inline-block; + width: 210px; + height: 30px; + padding: 4px; + font-size: 13px; + line-height: 18px; + color: #808080; + border: 1px solid #ccc; + border-radius: 3px; + box-sizing: border-box; +} + +.cbi-dropdown { + border: 1px solid #ccc; + border-radius: 3px; + display: inline-flex; + padding: 0; + cursor: pointer; + height: auto; + background: linear-gradient(#fff 0%, #e9e8e6 100%); + position: relative; + color: #404040; +} + +.cbi-dropdown { + /* min-width: 210px; */ + max-width: 400px; + width: auto; +} + +.cbi-dropdown:focus { + outline: 2px solid #4b6e9b; +} + +.cbi-dropdown>ul { + margin: 0 !important; + padding: 0; + list-style: none; + overflow-x: hidden; + overflow-y: auto; + display: flex; + width: 100%; +} + +.cbi-dropdown>ul.preview { + display: none; +} + +.cbi-dropdown>.open, +.cbi-dropdown>.more { + flex-grow: 0; + flex-shrink: 0; + display: flex; + flex-direction: column; + justify-content: center; + text-align: center; + line-height: 2em; + padding: 0 .25em; +} + +.cbi-dropdown>.more, +.cbi-dropdown>ul>li[placeholder] { + color: #777; + font-weight: bold; + text-shadow: 1px 1px 0px #fff; + display: none; +} + +.cbi-dropdown>ul>li { + display: none; + padding: .25em; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + flex-shrink: 1; + flex-grow: 1; + align-items: center; + align-self: center; + /* color: #404040; */ + min-height: 20px; +} + +.cbi-dropdown>ul>li .hide-open { + display: block; + display: initial; +} + +.cbi-dropdown>ul>li .hide-close { + display: none; +} + +.cbi-dropdown>ul>li[display]:not([display="0"]) { + border-left: 1px solid #ccc; +} + +.cbi-dropdown[empty]>ul { + max-width: 1px; +} + +.cbi-dropdown>ul>li>form { + display: none; + margin: 0; + padding: 0; + pointer-events: none; +} + +.cbi-dropdown>ul>li img { + vertical-align: middle; + margin-right: .25em; +} + +.cbi-dropdown>ul>li>form>input[type="checkbox"] { + margin: 0; +} + +.cbi-dropdown>ul>li input[type="text"] { + height: 20px; +} + +.cbi-dropdown[open] { + position: relative; +} + +.cbi-dropdown[open]>ul.dropdown { + display: block; + background: #f6f6f5; + border: 1px solid #918e8c; + box-shadow: 0 0 4px #918e8c; + position: absolute; + z-index: 1000; + max-width: none; + min-width: 100%; + width: auto; +} + +.cbi-dropdown>ul>li[display], +.cbi-dropdown[open]>ul.preview, +.cbi-dropdown[open]>ul.dropdown>li, +.cbi-dropdown[multiple]>ul>li>label, +.cbi-dropdown[multiple][open]>ul.dropdown>li, +.cbi-dropdown[multiple][more]>.more, +.cbi-dropdown[multiple][empty]>.more { + flex-grow: 1; + display: flex; +} + +.cbi-dropdown[empty]>ul>li, +.cbi-dropdown[optional][open]>ul.dropdown>li[placeholder], +.cbi-dropdown[multiple][open]>ul.dropdown>li>form { + display: block; +} + +.cbi-dropdown[open]>ul.dropdown>li .hide-open { + display: none; +} + +.cbi-dropdown[open]>ul.dropdown>li .hide-close { + display: block; + display: initial; +} + +.cbi-dropdown[open]>ul.dropdown>li { + border-bottom: 1px solid #ccc; +} + +.cbi-dropdown[open]>ul.dropdown>li[selected] { + background: #b0d0f0; +} + +.cbi-dropdown[open]>ul.dropdown>li.focus { + background: linear-gradient(90deg, #a3c2e8 0%, #84aad9 100%); +} + +.cbi-dropdown[open]>ul.dropdown>li:last-child { + margin-bottom: 0; + border-bottom: none; +} + +.cbi-dropdown[disabled] { + pointer-events: none; + opacity: .6; +} + + +/* Label */ + +.label { + border-radius: 10px !important; + display: inline-block; + background: #bbb; + border-bottom: 2px solid rgba(0, 0, 0, .05); + border-radius: 4px; + color: #fff; + font-size: 14px; + line-height: 24px; + text-transform: uppercase; + margin-top: 6px; + padding: 2px 9px; + cursor: pointer; +} + +.label.success { + background: #726bda; +} + +.label.notice { + background: #726bda; +} + +.label.important { + background: #f00; +} + +.label.warning { + background: #fc0; +} + + +/* Main */ + +h2 a { + color: #333; +} + +h2 a:hover { + opacity: 1; +} + +h2+.cbi-map-descr { + margin-top: -10px; +} + +.alert-message { + position: relative; + padding: 15px; + margin-bottom: 10px; + background: #d9d6ff; + /* border: 1px solid rgba(0, 0, 0, .1); + border-width: 2px 0; */ + border-radius: 2px; +} + +.alert-message>h4, +p { + margin: 0; +} + +.error, +.errorbox { + display: inline; +} + +.error { + color: #f00; +} + +.errorbox { + color: #3b3; +} + +#maincontainer { + box-shadow: 0 0 2px rgba(0, 0, 0, .3); + border-radius: 4px; + width: 500px; + margin: 120px auto 0; + padding: 30px; +} + +#syslog { + color: #111; + width: 100%; +} + + +/* Change List */ + +.uci-change-legend { + padding-top: 15px; +} + +.uci-change-legend-label { + float: left; + margin-right: 100px; +} + +.uci-change-legend-label>ins, +.uci-change-legend-label>del, +.uci-change-legend-label>var { + float: left; + width: 10px; + height: 10px; + margin-top: 3px; + margin-right: 6px; +} + +.uci-change-list { + font-family: monospace; +} + +.uci-change-list ins, +.uci-change-legend-label ins, +.uci-change-list del, +.uci-change-legend-label del, +.uci-change-list var, +.uci-change-legend-label var { + display: block; + text-decoration: none; + padding: 2px; +} + +.uci-change-list ins, +.uci-change-legend-label ins { + background: #cfc; + border: 2px solid #4f4; +} + +.uci-change-list del, +.uci-change-legend-label del { + background: #fcc; + border: 2px solid #f00; +} + +.uci-change-list var, +.uci-change-legend-label var { + background: #f2f2f2; + border: 2px solid #ccc; +} + +.uci-change-list var ins, +.uci-change-list var del { + border: 0; + white-space: pre; + padding: 0; +} + +.uci-change-legend-label var ins, +.uci-change-legend-label var del { + border: 0; + line-height: 6px; +} + + +/* Tabs */ + +.tabs, +.cbi-tabmenu { + border-bottom: 1.5px solid #948fe1; + margin-bottom: 20px; +} + +.tabs li, +.cbi-tabmenu li { + display: inline-block; +} + +.tabs a, +.cbi-tabmenu a { + display: block; + color: #726bda; + line-height: 34px; + margin-bottom: -2px; + margin-right: 20px; + padding: 0 3px; +} + +.active a, +.cbi-tab a { + border-bottom: 2px solid #111; + color: #111; +} + + +/* Fieldset */ + +fieldset { + border: 0px; + margin: 10px 0; + padding: 0; +} + +fieldset fieldset { + margin: 0; +} + +.cbi-value { + margin-bottom: 1em; + zoom: 1; + clear: both; +} + +table .cbi-value-field, +.table .cbi-value-field { + display: table-cell; +} + +.cbi-value-title { + /* white-space: nowrap; + overflow: hidden; + text-overflow: clip; */ + display: table-cell; + padding-top: 0.4em; + line-height: 1.2em; + float: left; + width: 13em; + margin-right: 1.5em; + text-align: right; + color: #404040; +} + +.cbi-value-field { + color: #811; + display: table-cell; +} + +.cbi-section-table-cell { + white-space: nowrap; +} + +.cbi-section-create { + margin: -3px; + display: inline-flex; + align-items: center; +} + +.cbi-section-create>* { + margin: 3px; + flex: 1 1 auto; +} + + +/* Table */ + + +/* .cbi-section table tbody tr:nth-child(odd) { background-color: #fdfdfd; } */ + +table, +.table { + width: 100%; + display: table; + margin: 0 0 10px !important; + border-radius: 5px; + /* border: 1px solid #a9b1bb26; */ + border-collapse: collapse; + position: relative; +} + + +/* table tr:first-child, .table .tr:first-child { border-top: 1px solid #b0e6b9; } */ + + +/* table tr, .table .tr { border-bottom: 1px solid #b0e6b9; } */ + +table th, +table td, +.table .th, +.table .td { + color: #811; + padding: 5px 3px !important; +} + +table tr+tr td, +.table .tr+.tr .td { + border-top: 1px solid #a9b1bb26; +} + +table th, +.table .th { + text-align: left; + font-weight: bold; +} + +table td:first-child, +.table .td:first-child { + color: #127; +} + +.table[width="33%"], +.th[width="33%"], +.td[width="33%"] { + width: 33%; +} + +.table[width="100%"], +.th[width="100%"], +.td[width="100%"] { + width: 100%; +} + +.table .th, +.table .td { + display: table-cell; + vertical-align: middle; +} + +.table .tr.placeholder { + height: calc(3em + 20px); +} + +.table .tr.placeholder>.td { + position: absolute; + left: 0; + right: 0; + bottom: 0; + text-align: center; + line-height: 3em; +} + +.td.cbi-section-actions>* { + display: flex; +} + +.td.cbi-section-actions>*>*, +.td.cbi-section-actions>*>form>* { + flex: 1 1 4em; + margin: 0 1px; +} + +.td.cbi-section-actions>*>.cbi-button-up, +.cbi-input-up { + background: unset; +} + +.td.cbi-section-actions>*>.cbi-button-down, +.cbi-input-down { + background: unset; +} + +#cbi-network .tr, +#cbi-wireless .tr, +.tr .tr:first-child, +#cbi-network tr, +#cbi-wireless tr, +tr tr:first-child { + border-top: 0; +} + +#cbi-network .tr, +#cbi-wireless .tr, +.tr .tr, +#cbi-network tr, +#cbi-wireless tr, +tr tr { + border-bottom: 0; +} + +#cpu_free, +#memtotal, +#memfree, +#memcache, +#membuff, +#conns, +#swaptotal, +#swapfree { + line-height: 18px; +} + +#cpu_free>div, +#memtotal>div, +#memfree>div, +#memcache>div, +#membuff>div, +#conns>div, +#swaptotal>div, +#swapfree>div { + border: 1.5px solid #bbb !important; + border-radius: 5px; + width: 240px !important; +} + +#cpu_free>div>div, +#memtotal>div>div, +#memfree>div>div, +#memcache>div>div, +#membuff>div>div, +#conns>div>div, +#swaptotal>div>div, +#swapfree>div>div { + background: #948fe1a6 !important; + height: 18px !important; + border-radius: 3px; +} + + +/* Form */ + +input, +textarea, +select { + display: inline-block; + width: 16em; + padding: 0.5em; + border: 1px solid #726bda; + border-radius: 5px; + box-sizing: border-box; + color: #111; + font: inherit; + line-height: 1em; +} + +table.cbi-section-table input, +table.cbi-section-table textarea, +table.cbi-section-table select, +.table.cbi-section-table input, +.table.cbi-section-table textarea, +.table.cbi-section-table select { + width: auto; +} + +#cbi-network-switch_vlan select, +#cbi-firewall-zone select, +#cbi-firewall-redirect select { + width: auto; +} + +input:active, +input:focus { + outline: 0; + border-color: #726bda; +} + +input[type=file]:focus, +input[type=checkbox]:focus, +textarea:focus, +select:focus { + outline: 0; +} + +input[type=button], +input[type=reset], +input[type=submit], +button { + width: auto !important; +} + +input[type=checkbox], +input[type=radio] { + width: auto; + margin: 0; + vertical-align: middle; + cursor: pointer; +} + +input[type=file] { + padding: 0; + border: 0; +} + +.cbi-input-invalid, +.cbi-value-error input { + color: #f00; + border-color: #f00 !important; +} + +.cbi-image-button { + margin: 10px 8px; + vertical-align: middle; +} + +.uneditable-input { + background: #fafafa; + border-color: #f2f2f2; + color: #ccc; + cursor: not-allowed; +} + +.uneditable-input:active, +.uneditable-input:focus { + border-color: #f2f2f2; +} + +.cbi-value-description { + /* display: inline; */ + background-image: url(/luci-static/resources/cbi/help.gif); + /* background-position-x: 0px; + background-position-y: 1px; */ + background-position: 0em 0.3em; + background-repeat: no-repeat; + padding: 0 1.2rem; +} + +.cbi-value-description img { + display: none; + vertical-align: sub; +} + +.cbi-page-actions { + text-align: right; + padding: 10px 0px; +} + +.cbi-page-actions.right { + float: inherit; +} + + +/* Button */ + +.cbi-button, +button { + border-radius: 6px !important; + display: inline-block; + background: #fff; + border: 2px solid #99d; + border-radius: 2px; + box-shadow: 0 2px 2px rgba(0, 0, 0, .05); + color: #333; + line-height: 16px; + padding: 4px 8px; + cursor: pointer; + margin-left: 0.2em; +} + +.cbi-button:active, +.cbi-button:focus, +button:active, +button:focus { + border-color: #bbb; +} + +.cbi-button-up, +.cbi-input-up { + background-position: center; + background-image: url('../resources/cbi/up.gif'), linear-gradient(#ffffff, #ffffff 50%, #e6e6e6); + background-repeat: no-repeat; +} + +.cbi-button-down, +.cbi-input-down { + background-position: center; + background-image: url('../resources/cbi/down.gif'), linear-gradient(#ffffff, #ffffff 50%, #e6e6e6); + background-repeat: no-repeat; +} + +.cbi-button-add, +.cbi-input-add { + background: #948fe1; + border-color: #948fe1; + color: #fff; +} + +.cbi-button-add:active, +.cbi-button-add:focus, +.cbi-input-add:active, +.cbi-input-add:focus { + border-color: #948fe1; + opacity: .8; +} + +.cbi-button-remove, +.cbi-input-remove, +.cbi-section-remove input { + background: #c00; + border-color: #c00; + color: #fff; +} + +.cbi-button-remove:active, +.cbi-button-remove:focus, +.cbi-input-remove:active, +.cbi-input-remove:focus, +.cbi-section-remove input:active, +.cbi-section-remove input:focus { + border-color: #c00; + opacity: .8; +} + +.cbi-button-reload, +.cbi-input-reload { + background: rgb(0, 171, 232); + border-color: rgb(0, 171, 232); + color: #fff; +} + +.cbi-button-reload:active, +.cbi-button-reload:focus, +.cbi-input-reload:active, +.cbi-input-reload:focus { + border-color: rgb(0, 171, 232); + opacity: .8; +} + +.cbi-button-reset, +.cbi-input-reset { + background: #6bde84; + border-color: #6bde84; + color: #fff; +} + +.cbi-button-reset:active, +.cbi-button-reset:focus, +.cbi-input-reset:active, +.cbi-input-reset:focus { + border-color: #6bde84; + opacity: .8; +} + +.cbi-button-edit, +.cbi-input-edit { + background: #ff7700; + border-color: #ff7700; + color: #fff; +} + +.cbi-button-edit:active, +.cbi-button-edit:focus, +.cbi-input-edit:active, +.cbi-input-edit:focus { + border-color: #ff7700; + opacity: .8; +} + +.cbi-button-apply, +.cbi-input-apply { + background: rgb(148, 143, 225); + border-color: rgb(148, 143, 225); + color: #fff; +} + +.cbi-button-apply:active, +.cbi-button-apply:focus, +.cbi-input-apply:active, +.cbi-input-apply:focus { + border-color: rgb(148, 143, 225); + opacity: .8; +} + +.cbi-button-save, +.cbi-input-save { + background: rgb(0, 171, 232); + border-color: rgb(0, 171, 232); + color: #fff; +} + +.cbi-button-save:active, +.cbi-button-save:focus, +.cbi-input-save:active, +.cbi-input-save:focus { + border-color: rgb(0, 171, 232); + opacity: .8; +} + + +/* Input Error */ + +.cbi-section-error { + background: #fee; + border: 2px solid #f00; + padding: 10px; +} + +.cbi-section-error ul { + padding-left: 20px; +} + +.cbi-section-error ul li { + color: #f00; + list-style: disc; +} + + +/* Interface */ + +.ifacebox { + text-align: center; + margin-right: 60px; +} + +.ifacebox .ifacebox-head { + border-bottom: 1px solid #ccc; + padding: 2px; + background: #eee; +} + +.ifacebox .ifacebox-head.active { + background: #b9b6eb; +} + +.ifacebox .ifacebox-body { + border: 2px solid #f2f2f2; + border-top: 0; + border-radius: 0 0 4px 4px; + padding: 2px 10px; +} + +.network-status-table .ifacebox-body { + display: flex; + flex-direction: column; + height: 100%; + text-align: left; +} + +.network-status-table .ifacebox { + margin: .5em; + flex-grow: 1; +} + +.ifacebox .ifacebox-body { + padding: .25em; +} + +.ifacebox { + background-color: #fff; + border: 1px solid #ccc; + margin: 0 10px; + text-align: center; + white-space: nowrap; + background-image: linear-gradient(#fff, #fff 25%, #f9f9f9); + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + border-radius: 4px; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + display: inline-flex; + flex-direction: column; + line-height: 1.2em; + min-width: 100px; +} + +.ifacebadge { + display: inline-block; + flex-direction: row; + white-space: nowrap; + background-color: #fff; + border: 1px solid #ccc; + padding: 2px; + background-image: linear-gradient(#fff, #fff 25%, #f9f9f9); + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + border-radius: 4px; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + cursor: default; + line-height: 1.2em; +} + +.ifacebadge.large, +.network-status-table .ifacebox-body .ifacebadge { + display: inline-flex; + flex: 1; + padding: .25em; + min-width: 220px; + margin: .125em; + float: left; +} + +.ifacebadge img { + width: 16px; + height: 16px; + vertical-align: middle; +} + +.ifacebadge>*, +.ifacebadge.large>* { + margin: 0 .125em; +} + +.ifacebadge>*, +.ifacebadge.large>* { + margin: 0 .125em; +} + +.network-status-table { + position: absolute; + z-index: 1000; + left: -10000px; + box-shadow: 0 0 2px #ccc; + border-radius: 3px; + background: #fff; + white-space: pre; + opacity: 0; + transition: opacity .25s ease-in; + padding: 2px 5px; +} + +.cbi-tooltip { + position: absolute; + z-index: 1000; + left: -1000px; + opacity: 0; + transition: opacity .25s ease-out; +} + +.cbi-tooltip-container { + /* cursor: help; */ +} + + +/* Firewall */ + +.zonebadge { + display: inline-block; + border-radius: 4px; + color: #333; + white-space: nowrap; + padding: 0 8px; + cursor: pointer; +} + +.zonebadge em, +.zonebadge strong { + margin: 0 5px; +} + +.zonebadge-empty { + border: 2px dashed #ddd; + color: #ddd; + font-style: italic; +} + +.zone-forwards { + display: flex; + flex-wrap: wrap; +} + +.zone-forwards .zone-src, +.zone-forwards .zone-dest { + display: flex; + flex-direction: column; +} + +.zone-forwards>span { + flex-basis: 10%; + text-align: center; +} + +.zone-forwards>* { + flex: 1 1 40%; + padding: 1px; +} + + +/* Footer */ + +footer { + border-top: 2px solid #948fe1; + color: #111; + text-align: center; + padding: 10px 0; + margin-top: 10px; +} + +footer a { + color: #726bda; +} + +footer a:hover { + color: #fff; +} + + +/* diy */ + +#wan4_i, +#wan6_i { + vertical-align: top; + width: 50px !important; +} + +/* login */ +body.node-main-login { + background: url(bg.jpg); + background-repeat: no-repeat; + background-size: 100% 100%; + -moz-background-size: 100% 100%; + padding-top: unset; +} + +body.node-main-login>header { + background: none; + border-bottom: none; +} + +body.node-main-login .alert-message { + z-index: 999; +} + +.node-main-login>.container>form { + width: 20rem; + display: inline-block; + padding: 1rem 1rem; + border-radius: .375rem; + text-align: center; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +.node-main-login>.container>form .errorbox { + color: red; +} + +.node-main-login>.container>form>.cbi-map>h2 { + width: 100px; + height: 100px; + color: #fff; + text-align: center; + letter-spacing: 4px; + display: block; + margin: -100px auto 15px auto; + padding: 0; + text-indent: -500px; + overflow: hidden; + border-radius: 60px; + /* border: #948fe1 3px solid; */ + background-image: url(wifi.png); + background-size: cover; + /* box-shadow: 0 4px 20px 0px rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(156, 39, 176, 0.4); */ +} + +.node-main-login>.container>form input[name='luci_username'], +.node-main-login>.container>form input[name='luci_password'] { + background: unset; + color: #000; +} + +.node-main-login>.container>form>.cbi-map>.cbi-section { + display: inline-block; +} + +.node-main-login>.container>footer { + position: absolute; + top: 40%; + left: 50%; + transform: translate(-50%, -50%); + width: 100%; + margin-top: 60px; + display: none; +} + +.node-main-login>.container>form .cbi-page-actions { + text-align: center !important; +} + +/* luci 19 */ +body.modal-overlay-active { + overflow: hidden; + height: 100vh; +} + +body.modal-overlay-active #modal_overlay { + visibility: visible; + left: 0; + right: 0; + opacity: 1; +} + +body.modal-overlay-active #modal_overlay>.modal { + align-items: center; + box-shadow: 0 0 3px #444; + display: flex; + flex-wrap: wrap; + max-height: unset; + max-width: unset; + min-height: 32px; + min-width: 270px; + background: #d9d6ff !important; + border-radius: 3px; + padding: 1em; + margin: 0; + position: absolute; + top: 15%; + left: 50%; + transform: translate(-50%, -15%); +} + +#modal_overlay { + visibility: hidden; + position: fixed; + top: 0; + bottom: 0; + left: -10000px; + right: 10000px; + background: rgba(0, 0, 0, 0.7); + z-index: 900; + overflow-y: scroll; + -webkit-overflow-scrolling: touch; + transition: opacity .125s ease-in; + opacity: 0; +} + +#modal_overlay>.modal.uci-dialog, +#modal_overlay>.modal.cbi-modal { + max-width: 900px; +} + +/*.modal.alert-message.notice { + position: absolute; + padding: 15px; + margin-bottom: 10px; + background: #d9d6ff; + border: 1px solid rgba(0, 0, 0, .1); + border-width: 2px 0; +}*/ + +.modal>* { + flex-basis: 100%; + line-height: normal; + margin-bottom: .5em; + max-width: 100%; +} + +#modal_overlay .modal>* { + flex-basis: 100%; + line-height: normal; + margin-bottom: .5em; +} + +[data-tab-title] { + height: 0; + opacity: 0; + overflow: hidden; +} + +[data-tab-active="true"], +.cbi-filebrowser.open { + height: auto; + opacity: 1; + overflow: visible; + transition: opacity .25s ease-in; +} + +.tabs>li:not(.active), +.cbi-tabmenu>.cbi-tab-disabled { + color: #999; +} + +.cbi-dynlist { + height: auto; + min-height: 30px; + display: inline-flex; + flex-direction: column; +} + +.cbi-dropdown:not(.btn):not(.cbi-button), +.cbi-dynlist { + min-width: 210px; + max-width: 400px; + width: auto; + background: white; + border: 1px solid #118af3; + border-radius: 5px; + box-sizing: border-box; + padding: 0.3em !important; +} + +.cbi-dynlist>.item { + margin-bottom: 4px; + box-shadow: 0 0 2px #ccc; + background: #fff; + border: 1px solid #118af3; + border-radius: 3px; + position: relative; + pointer-events: none; + padding: 2px 2em 2px 4px; +} + +.cbi-dynlist>.item::after { + content: "×"; + position: absolute; + display: inline-flex; + align-items: center; + top: -1px; + right: -1px; + bottom: -1px; + border: 1px solid #ccc; + border-radius: 0 3px 3px 0; + font-weight: 700; + color: #c44; + pointer-events: auto; + padding: 0 6px; +} + +.cbi-dynlist>.add-item, +.td.cbi-section-actions>* { + display: flex; +} + +.cbi-dynlist>.add-item>input, +.cbi-dynlist>.add-item>button { + flex: 1 1 auto; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.cbi-dropdown.btn>.open, +.cbi-dropdown.cbi-button>.open { + margin-left: .5em; + border-left: 1px solid; + padding: 0 .5em; +} + +.cbi-dropdown.btn>ul:not(.dropdown), +.cbi-dropdown.cbi-button>ul:not(.dropdown) { + margin: 0 0 0 13px !important; +} + +.btn.primary, +.cbi-button-action.important, +.cbi-page-actions .cbi-button-apply, +.cbi-section-actions .cbi-button-edit { + color: #fff; +} + +.cbi-dropdown { + display: inline-flex !important; + cursor: pointer; + height: auto; + position: relative; + padding: 0 !important; +} + +.cbi-progressbar { + border: 1px solid #ccc; + border-radius: 3px; + position: relative; + min-width: 170px; + height: 20px; + background: #f9f9f9; + margin: 4px 0; +} + +.cbi-progressbar>div { + background: #d9d6ff; + height: 100%; + transition: width .25s ease-in; + width: 0%; +} + +.cbi-progressbar::after { + position: absolute; + bottom: 0; + top: 0; + right: 0; + left: 0; + text-align: center; + text-shadow: 0 0 2px #fff; + content: attr(title); + white-space: pre; + overflow: hidden; + text-overflow: ellipsis; +} \ No newline at end of file diff --git a/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_purple/favicon.ico b/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_purple/favicon.ico new file mode 100644 index 0000000000..77a138ba0c Binary files /dev/null and b/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_purple/favicon.ico differ diff --git a/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_purple/html5.js b/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_purple/html5.js new file mode 100644 index 0000000000..1ec510f2a4 --- /dev/null +++ b/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_purple/html5.js @@ -0,0 +1,3 @@ +// HTML5 Shiv v3 | @jon_neal @afarkas @rem | MIT/GPL2 Licensed +// Uncompressed source: https://github.com/aFarkas/html5shiv +(function(a,b){function f(a){var c,d,e,f;b.documentMode>7?(c=b.createElement("font"),c.setAttribute("data-html5shiv",a.nodeName.toLowerCase())):c=b.createElement("shiv:"+a.nodeName);while(a.firstChild)c.appendChild(a.childNodes[0]);for(d=a.attributes,e=d.length,f=0;f7?e[g][e[g].length-1]=e[g][e[g].length-1].replace(d,'$1font[data-html5shiv="$2"]'):e[g][e[g].length-1]=e[g][e[g].length-1].replace(d,"$1shiv\\:$2"),e[g]=e[g].join("}");return e.join("{")}var c=function(a){return a.innerHTML="",a.childNodes.length===1}(b.createElement("a")),d=function(a,b,c){return b.appendChild(a),(c=(c?c(a):a.currentStyle).display)&&b.removeChild(a)&&c==="block"}(b.createElement("nav"),b.documentElement,a.getComputedStyle),e={elements:"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video".split(" "),shivDocument:function(a){a=a||b;if(a.documentShived)return;a.documentShived=!0;var f=a.createElement,g=a.createDocumentFragment,h=a.getElementsByTagName("head")[0],i=function(a){f(a)};c||(e.elements.join(" ").replace(/\w+/g,i),a.createElement=function(a){var b=f(a);return b.canHaveChildren&&e.shivDocument(b.document),b},a.createDocumentFragment=function(){return e.shivDocument(g())});if(!d&&h){var j=f("div");j.innerHTML=["x"].join(""),h.insertBefore(j.lastChild,h.firstChild)}return a}};e.shivDocument(b),a.html5=e;if(c||!a.attachEvent)return;a.attachEvent("onbeforeprint",function(){if(a.html5.supportsXElement||!b.namespaces)return;b.namespaces.shiv||b.namespaces.add("shiv");var c=-1,d=new RegExp("^("+a.html5.elements.join("|")+")$","i"),e=b.getElementsByTagName("*"),g=e.length,j,k=i(h(function(a,b){var c=[],d=a.length;while(d)c.unshift(a[--d]);d=b.length;while(d)c.unshift(b[--d]);c.sort(function(a,b){return a.sourceIndex-b.sourceIndex}),d=c.length;while(d)c[--d]=c[d].styleSheet;return c}(b.getElementsByTagName("style"),b.getElementsByTagName("link"))));while(++c.pull-right>* { + position: absolute; + top: 1rem; + right: 0.5rem; + cursor: pointer; + } +} + +@media screen and (max-width: 480px) { + body { + font-size: 12px; + } + header { + font-size: 13px; + } + legend { + font-size: 14px; + } + .dropdown-menu a { + font-size: 13px; + min-width: 130px; + padding: 0 15px; + } + .mobile-hide { + display: none; + } + #maincontent.container { + padding: 0px 10px; + } + div.cbi-section, fieldset { + min-width: inherit; + overflow-x: auto; + overflow-y: hidden; + } + .cbi-value { + } + .cbi-value-title { + width: 30%; + min-width: 0rem !important; + margin-right: 1em; + /* text-align: left; + padding-left: 1em; */ + } + .cbi-value-field { + width: 55%; + } + .cbi-value-description { + width: 75%; + display: inline-table; + padding: 1px 1.2rem; + background-position-y: 3px; + } + .cbi-value-field .cbi-input-select, + .cbi-value input[type="password"], + .cbi-value input[type="text"] { + min-width: unset; + /* width: 95%; */ + } +} + +@media screen and (max-device-width: 600px) { + #maincontent.container { + margin-top: 30px; + } +} + +@media screen and (max-device-width: 360px) { + #maincontent.container { + margin-top: 30px; + } +} + +@media screen and (max-device-width: 200px) { + #maincontent.container { + margin-top: 30px; + } +} \ No newline at end of file diff --git a/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_purple/wifi.png b/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_purple/wifi.png new file mode 100644 index 0000000000..629594f824 Binary files /dev/null and b/package/lienol/luci-theme-bootstrap-mod/htdocs/luci-static/bootstrap_purple/wifi.png differ diff --git a/package/lienol/luci-theme-bootstrap-mod/luasrc/view/themes/bootstrap_blue/footer.htm b/package/lienol/luci-theme-bootstrap-mod/luasrc/view/themes/bootstrap_blue/footer.htm new file mode 100644 index 0000000000..93012da5e2 --- /dev/null +++ b/package/lienol/luci-theme-bootstrap-mod/luasrc/view/themes/bootstrap_blue/footer.htm @@ -0,0 +1,55 @@ +<%# + Copyright 2008 Steven Barth + Copyright 2008 Jo-Philipp Wich + Copyright 2012 David Menting + Copyright 2018-2019 Lienol + Licensed to the public under the Apache License 2.0. +-%> + +<% + local ver = require "luci.version" + local disp = require "luci.dispatcher" + local request = disp.context.path + local category = request[1] + local tree = disp.node() + local categories = disp.node_childs(tree) +%> + +
+
+ + + diff --git a/package/lienol/luci-theme-bootstrap-mod/luasrc/view/themes/bootstrap_blue/header.htm b/package/lienol/luci-theme-bootstrap-mod/luasrc/view/themes/bootstrap_blue/header.htm new file mode 100644 index 0000000000..1aeffbc65c --- /dev/null +++ b/package/lienol/luci-theme-bootstrap-mod/luasrc/view/themes/bootstrap_blue/header.htm @@ -0,0 +1,220 @@ +<%# + Copyright 2008 Steven Barth + Copyright 2008 Jo-Philipp Wich + Copyright 2012 David Menting + Copyright 2018-2019 Lienol + Licensed to the public under the Apache License 2.0. +-%> + +<% + local sys = require "luci.sys" + local util = require "luci.util" + local http = require "luci.http" + local disp = require "luci.dispatcher" + + local boardinfo = util.ubus("system", "board") + + local request = disp.context.path + local request2 = disp.context.request + + local category = request[1] + local cattree = category and disp.node(category) + + local leaf = request2[#request2] + + local tree = disp.node() + local node = disp.context.dispatched + + local categories = disp.node_childs(tree) + + local c = tree + local i, r + + -- tag all nodes leading to this page + for i, r in ipairs(request) do + if c.nodes and c.nodes[r] then + c = c.nodes[r] + c._menu_selected = true + end + end + + -- send as HTML5 + http.prepare_content("text/html") + + local function nodeurl(prefix, name, query) + local u = url(prefix, name) + if query then + u = u .. http.build_querystring(query) + end + return pcdata(u) + end + + local function render_tabmenu(prefix, node, level) + if not level then + level = 1 + end + + local childs = disp.node_childs(node) + if #childs > 0 then + if level > 2 then + write('
    ') + end + + local selected_node + local selected_name + local i, v + + for i, v in ipairs(childs) do + local nnode = node.nodes[v] + if nnode._menu_selected then + selected_node = nnode + selected_name = v + end + + if level > 2 then + write('
  • %s
  • ' %{ + v, (nnode._menu_selected or (node.leaf and v == leaf)) and 'active' or '', + nodeurl(prefix, v, nnode.query), + striptags(translate(nnode.title)) + }) + end + end + + if level > 2 then + write('
') + end + + if selected_node then + render_tabmenu(prefix .. "/" .. selected_name, selected_node, level + 1) + end + end + end + + local function render_submenu(prefix, node) + local childs = disp.node_childs(node) + if #childs > 0 then + write('') + end + end + + local function render_topmenu() + local childs = disp.node_childs(cattree) + if #childs > 0 then + write('') + end + end + + local function render_changes() + local file = io.open("/usr/lib/lua/luci/view/admin_uci/changes.htm", "rb") + if file then file:close() end + if file ~= nil then + -- calculate the number of unsaved changes + if tree.nodes[category] and tree.nodes[category].ucidata then + local ucichanges = 0 + + for i, j in pairs(require("luci.model.uci").cursor():changes()) do + for k, l in pairs(j) do + for m, n in pairs(l) do + ucichanges = ucichanges + 1; + end + end + end + + if ucichanges > 0 then + write('%s: %d' %{ + url(category, 'uci/changes'), + http.urlencode(http.formvalue('redir') or table.concat(disp.context.request, "/")), + translate('Unsaved Changes'), + ucichanges + }) + end + end + end + end +-%> + + + + + <%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI + + + + + + <% if node and node.css then %> + + <% end -%> + <% if css then %> + + <% end -%> + + + + + + + "> +
+
+
+ <%=boardinfo.hostname or "?"%> + <% render_topmenu() %> +
+ <% render_changes() %> + +
+
+
+
+ + <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%> +
+
+

<%:No password set!%>

+ <%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%>
+ "><%:Go to password configuration...%> +
+
+ <%- end -%> + + + +
+ <% if category then render_tabmenu(category, cattree) end %> diff --git a/package/lienol/luci-theme-bootstrap-mod/luasrc/view/themes/bootstrap_purple/footer.htm b/package/lienol/luci-theme-bootstrap-mod/luasrc/view/themes/bootstrap_purple/footer.htm new file mode 100644 index 0000000000..93012da5e2 --- /dev/null +++ b/package/lienol/luci-theme-bootstrap-mod/luasrc/view/themes/bootstrap_purple/footer.htm @@ -0,0 +1,55 @@ +<%# + Copyright 2008 Steven Barth + Copyright 2008 Jo-Philipp Wich + Copyright 2012 David Menting + Copyright 2018-2019 Lienol + Licensed to the public under the Apache License 2.0. +-%> + +<% + local ver = require "luci.version" + local disp = require "luci.dispatcher" + local request = disp.context.path + local category = request[1] + local tree = disp.node() + local categories = disp.node_childs(tree) +%> + +
+
+ + + diff --git a/package/lienol/luci-theme-bootstrap-mod/luasrc/view/themes/bootstrap_purple/header.htm b/package/lienol/luci-theme-bootstrap-mod/luasrc/view/themes/bootstrap_purple/header.htm new file mode 100644 index 0000000000..1aeffbc65c --- /dev/null +++ b/package/lienol/luci-theme-bootstrap-mod/luasrc/view/themes/bootstrap_purple/header.htm @@ -0,0 +1,220 @@ +<%# + Copyright 2008 Steven Barth + Copyright 2008 Jo-Philipp Wich + Copyright 2012 David Menting + Copyright 2018-2019 Lienol + Licensed to the public under the Apache License 2.0. +-%> + +<% + local sys = require "luci.sys" + local util = require "luci.util" + local http = require "luci.http" + local disp = require "luci.dispatcher" + + local boardinfo = util.ubus("system", "board") + + local request = disp.context.path + local request2 = disp.context.request + + local category = request[1] + local cattree = category and disp.node(category) + + local leaf = request2[#request2] + + local tree = disp.node() + local node = disp.context.dispatched + + local categories = disp.node_childs(tree) + + local c = tree + local i, r + + -- tag all nodes leading to this page + for i, r in ipairs(request) do + if c.nodes and c.nodes[r] then + c = c.nodes[r] + c._menu_selected = true + end + end + + -- send as HTML5 + http.prepare_content("text/html") + + local function nodeurl(prefix, name, query) + local u = url(prefix, name) + if query then + u = u .. http.build_querystring(query) + end + return pcdata(u) + end + + local function render_tabmenu(prefix, node, level) + if not level then + level = 1 + end + + local childs = disp.node_childs(node) + if #childs > 0 then + if level > 2 then + write('
    ') + end + + local selected_node + local selected_name + local i, v + + for i, v in ipairs(childs) do + local nnode = node.nodes[v] + if nnode._menu_selected then + selected_node = nnode + selected_name = v + end + + if level > 2 then + write('
  • %s
  • ' %{ + v, (nnode._menu_selected or (node.leaf and v == leaf)) and 'active' or '', + nodeurl(prefix, v, nnode.query), + striptags(translate(nnode.title)) + }) + end + end + + if level > 2 then + write('
') + end + + if selected_node then + render_tabmenu(prefix .. "/" .. selected_name, selected_node, level + 1) + end + end + end + + local function render_submenu(prefix, node) + local childs = disp.node_childs(node) + if #childs > 0 then + write('') + end + end + + local function render_topmenu() + local childs = disp.node_childs(cattree) + if #childs > 0 then + write('') + end + end + + local function render_changes() + local file = io.open("/usr/lib/lua/luci/view/admin_uci/changes.htm", "rb") + if file then file:close() end + if file ~= nil then + -- calculate the number of unsaved changes + if tree.nodes[category] and tree.nodes[category].ucidata then + local ucichanges = 0 + + for i, j in pairs(require("luci.model.uci").cursor():changes()) do + for k, l in pairs(j) do + for m, n in pairs(l) do + ucichanges = ucichanges + 1; + end + end + end + + if ucichanges > 0 then + write('%s: %d' %{ + url(category, 'uci/changes'), + http.urlencode(http.formvalue('redir') or table.concat(disp.context.request, "/")), + translate('Unsaved Changes'), + ucichanges + }) + end + end + end + end +-%> + + + + + <%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI + + + + + + <% if node and node.css then %> + + <% end -%> + <% if css then %> + + <% end -%> + + + + + + + "> +
+
+
+ <%=boardinfo.hostname or "?"%> + <% render_topmenu() %> +
+ <% render_changes() %> + +
+
+
+
+ + <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%> +
+
+

<%:No password set!%>

+ <%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%>
+ "><%:Go to password configuration...%> +
+
+ <%- end -%> + + + +
+ <% if category then render_tabmenu(category, cattree) end %> diff --git a/package/lienol/luci-theme-bootstrap-mod/root/etc/uci-defaults/30_luci-theme-bootstrap-mod b/package/lienol/luci-theme-bootstrap-mod/root/etc/uci-defaults/30_luci-theme-bootstrap-mod new file mode 100755 index 0000000000..c60815910c --- /dev/null +++ b/package/lienol/luci-theme-bootstrap-mod/root/etc/uci-defaults/30_luci-theme-bootstrap-mod @@ -0,0 +1,7 @@ +#!/bin/sh +uci batch <<-EOF + set luci.themes.Bootstrap_Blue=/luci-static/bootstrap_blue + set luci.themes.Bootstrap_Purple=/luci-static/bootstrap_purple + commit luci +EOF +exit 0 diff --git a/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/css/style.css b/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/css/style.css old mode 100644 new mode 100755 diff --git a/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/favicon.ico b/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/favicon.ico old mode 100644 new mode 100755 diff --git a/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/Roboto-Medium-webfont.woff b/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/Roboto-Medium-webfont.woff old mode 100644 new mode 100755 diff --git a/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/Roboto-Regular-webfont.woff b/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/Roboto-Regular-webfont.woff old mode 100644 new mode 100755 diff --git a/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/advancedtomato.eot b/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/advancedtomato.eot old mode 100644 new mode 100755 diff --git a/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/advancedtomato.svg b/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/advancedtomato.svg old mode 100644 new mode 100755 diff --git a/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/advancedtomato.ttf b/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/advancedtomato.ttf old mode 100644 new mode 100755 diff --git a/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/advancedtomato.woff b/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/advancedtomato.woff old mode 100644 new mode 100755 diff --git a/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/font.eot b/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/font.eot old mode 100644 new mode 100755 diff --git a/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/font.svg b/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/font.svg old mode 100644 new mode 100755 diff --git a/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/font.ttf b/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/font.ttf old mode 100644 new mode 100755 diff --git a/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/font.woff b/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/fonts/font.woff old mode 100644 new mode 100755 diff --git a/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/js/jquery.min.js b/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/js/jquery.min.js old mode 100644 new mode 100755 diff --git a/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/js/script.js b/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/js/script.js old mode 100644 new mode 100755 diff --git a/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/logo.png b/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/logo.png old mode 100644 new mode 100755 diff --git a/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/nlogo.png b/package/lienol/luci-theme-netgear-mc/htdocs/luci-static/netgear_mc/nlogo.png old mode 100644 new mode 100755 diff --git a/package/lienol/luci-theme-netgear-mc/luasrc/view/themes/netgear_mc/footer.htm b/package/lienol/luci-theme-netgear-mc/luasrc/view/themes/netgear_mc/footer.htm old mode 100644 new mode 100755 diff --git a/package/lienol/luci-theme-netgear-mc/luasrc/view/themes/netgear_mc/header.htm b/package/lienol/luci-theme-netgear-mc/luasrc/view/themes/netgear_mc/header.htm old mode 100644 new mode 100755