From 7be562c4ffd40171b3e9688d15f3314a236e16a5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 24 Sep 2026 18:14:57 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8D=93=20Sync=202026-09-24=2018:14:57?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- luci-app-agentflow/Makefile | 2 +- .../luasrc/controller/agentflow.lua | 227 +++++++++++++++++- .../tests/test_agent_install_contract.py | 26 ++ .../test_agentflow_luci_open_contract.py | 4 + luci-app-passwall/Makefile | 2 +- .../model/cbi/passwall/client/acl_config.lua | 2 +- .../model/cbi/passwall/client/global.lua | 2 +- .../luasrc/passwall/util_shadowsocks.lua | 6 +- .../root/usr/share/passwall/app.sh | 28 ++- luci-theme-argon/Makefile | 2 +- .../htdocs/luci-static/argon/css/dark.css | 3 +- 11 files changed, 285 insertions(+), 19 deletions(-) diff --git a/luci-app-agentflow/Makefile b/luci-app-agentflow/Makefile index ac3583060..66b117e65 100644 --- a/luci-app-agentflow/Makefile +++ b/luci-app-agentflow/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk LUCI_TITLE:=AgentFlow PKG_VERSION:=1.0.1 -PKG_RELEASE:=8 +PKG_RELEASE:=9 LUCI_DEPENDS:=+agentflow +luci-compat +luci-lib-taskd +luci-lib-linkeaseauth +linkease-app-entry LUCI_MINIFY_CSS:=0 LUCI_MINIFY_JS:=0 diff --git a/luci-app-agentflow/luasrc/controller/agentflow.lua b/luci-app-agentflow/luasrc/controller/agentflow.lua index ed5a8f1d7..3107b8a5d 100644 --- a/luci-app-agentflow/luasrc/controller/agentflow.lua +++ b/luci-app-agentflow/luasrc/controller/agentflow.lua @@ -1,5 +1,15 @@ +local http = require "luci.http" + module("luci.controller.agentflow", package.seeall) +local AGENTS = { + { id = "codexcli", package = "@openai/codex", command = "codex" }, + { id = "claude-code", package = "@anthropic-ai/claude-code", command = "claude" }, + { id = "opencode", package = "opencode-ai", command = "opencode" }, + { id = "kimi", package = "@moonshot-ai/kimi-code", command = "kimi" }, + { id = "reasonix", package = "reasonix", command = "reasonix" } +} + function index() entry({"admin", "services", "agentflow_status"}, call("agentflow_status")) local open = entry({"admin", "services", "agentflow", "open"}, call("agentflow_open")) @@ -8,28 +18,241 @@ function index() open.sysauth = false if not nixio.fs.access("/etc/config/agentflow") then return end + + local install = entry({"admin", "services", "agentflow", "agent_install"}, call("agentflow_agent_install")) + install.leaf = true + entry({"admin", "services", "agentflow"}, cbi("agentflow"), _("AgentFlow"), 100).dependent = true end +local function write_json(obj) + http.prepare_content("application/json") + http.write_json(obj) +end + +local function require_post_csrf() + local dispatcher = require "luci.dispatcher" + local context = dispatcher.context or {} + local expected = context.authtoken or context.token + + if (http.getenv("REQUEST_METHOD") or "") ~= "POST" then + http.status(405, "Method Not Allowed") + write_json({ ok = false, error = "method not allowed" }) + return false + end + + if not context.authsession or not expected or http.formvalue("token") ~= expected then + http.status(403, "Forbidden") + write_json({ ok = false, error = "invalid csrf token" }) + return false + end + + return true +end + local function compat() local dispatcher = require "luci.dispatcher" return require("luci.model.linkease.apps_compat").new({ - http = require "luci.http", + http = http, resolver = require("luci.model.linkease.apps_openwrt").new(), auth_url = dispatcher.build_url("admin", "services", "linkease_auth", "auth") }) end +local function node_modules_root() + local sys = require "luci.sys" + local util = require "luci.util" + local script = table.concat({ + '. /lib/functions/mise.sh 2>/dev/null || exit 1', + 'istore_runtime_env >/dev/null 2>&1 || exit 1', + 'mise_bin="$(command -v mise-istore || command -v mise)"', + '[ -n "$mise_bin" ] || exit 1', + 'node_dir="$("$mise_bin" where node@lts 2>/dev/null)"', + '[ -n "$node_dir" ] || exit 1', + 'printf "%s/lib/node_modules" "$node_dir"' + }, "; ") + local root = sys.exec("/bin/sh -c " .. util.shellquote(script)) or "" + root = root:match("^%s*(.-)%s*$") + if root == "" or root:sub(1, 1) ~= "/" then + return nil + end + return root +end + +local function agent_commands_ready() + local sys = require "luci.sys" + local script = { + '. /lib/functions/mise.sh 2>/dev/null || exit 1', + 'istore_runtime_env >/dev/null 2>&1 || exit 1', + 'probe_prefix="/tmp/agentflow-agent-probe.$$"', + 'cleanup_agentflow_probe() { rm -f "$probe_prefix".*; }', + 'trap cleanup_agentflow_probe 0 HUP INT TERM', + 'check_agent_version() {', + '\tshim="$1"', + '\toutput="$2"', + '\t"$shim" --version >"$output" 2>/dev/null &', + '\tchild_pid=$!', + '\t(', + '\t\ttimer_pid=""', + '\t\tstop_timer() {', + '\t\t\t[ -z "$timer_pid" ] || kill "$timer_pid" 2>/dev/null', + '\t\t\texit 0', + '\t\t}', + '\t\ttrap stop_timer TERM INT', + '\t\tsleep 5 &', + '\t\ttimer_pid=$!', + '\t\twait "$timer_pid" 2>/dev/null || exit 0', + '\t\tkill "$child_pid" 2>/dev/null', + '\t) &', + '\twatchdog_pid=$!', + '\twait "$child_pid"', + '\trc=$?', + '\tkill "$watchdog_pid" 2>/dev/null', + '\twait "$watchdog_pid" 2>/dev/null', + '\t[ "$rc" -eq 0 ] && [ -s "$output" ]', + '}' + } + + for _, agent in ipairs(AGENTS) do + script[#script + 1] = 'shim="$HOME/.local/share/mise/shims/' .. agent.command .. '"' + script[#script + 1] = 'if [ -x "$shim" ] && check_agent_version "$shim" "$probe_prefix.' .. agent.id .. '"; then printf "ready:%s\\n" "' .. agent.id .. '"; fi' + end + + local output = sys.exec(table.concat(script, "\n")) or "" + local ready = {} + for id in output:gmatch("ready:([%w%-]+)") do + ready[id] = true + end + return ready +end + +local function agent_statuses() + local fs = require "nixio.fs" + local jsonc = require "luci.jsonc" + local root = node_modules_root() + local command_ready = root and agent_commands_ready() or {} + local statuses = {} + + for _, agent in ipairs(AGENTS) do + local status = { id = agent.id, installed = false } + if root then + local package_file = root .. "/" .. agent.package .. "/package.json" + local package_data = fs.readfile(package_file) + local package_json = package_data and jsonc.parse(package_data) or nil + local package_valid = type(package_json) == "table" + and type(package_json.version) == "string" + and package_json.version ~= "" + if package_valid and command_ready[agent.id] == true then + status.installed = true + status.version = package_json.version + end + end + statuses[#statuses + 1] = status + end + + return statuses, root ~= nil +end + function agentflow_status() local sys = require "luci.sys" local uci = require "luci.model.uci".cursor() + local agents, agents_available = agent_statuses() compat():legacy_status("agentflow", { running = sys.call("pidof agentflow >/dev/null") == 0, port = uci:get_first("agentflow", "agentflow", "port") or "9000", - base_path = uci:get_first("agentflow", "agentflow", "base_path") or "/apps/agentflow/" + base_path = uci:get_first("agentflow", "agentflow", "base_path") or "/apps/agentflow/", + agents_available = agents_available, + agents = agents }) end +function agentflow_agent_install() + local fs = require "nixio.fs" + local jsonc = require "luci.jsonc" + local sys = require "luci.sys" + local util = require "luci.util" + local task_id = "agentflow-agent-install" + local task_script = "/tmp/agentflow-agent-install.sh" + local installer_url = "https://fw.koolcenter.com/binary/geili/agentflow/releases/installapp/installapp-mise.sh" + local supported_agents = {} + for _, supported_agent in ipairs(AGENTS) do + supported_agents[supported_agent.id] = true + end + + if not require_post_csrf() then + return + end + + local agent = http.formvalue("agent") or "" + if not supported_agents[agent] then + write_json({ ok = false, error = "unsupported agent" }) + return + end + if not fs.access("/etc/init.d/tasks") then + write_json({ ok = false, error = "taskd is not available" }) + return + end + if not fs.access("/lib/functions/mise.sh") then + write_json({ ok = false, error = "mise environment helper is not available" }) + return + end + + local task_status = sys.exec("/etc/init.d/tasks task_status " .. task_id .. " 2>/dev/null") + local status = jsonc.parse(task_status) or {} + local running = type(status) == "table" and status.running + if running == true or running == 1 or running == "1" or running == "true" then + write_json({ ok = true, busy = true, task_id = task_id }) + return + end + + local install_script = table.concat({ + "set -e", + "agent=" .. util.shellquote(agent), + "installer_url=" .. util.shellquote(installer_url), + 'installer="/tmp/agentflow-installapp-mise.$$"', + 'cleanup() { rm -f "$installer" "$0"; }', + "trap cleanup 0 HUP INT TERM", + '. /lib/functions/mise.sh', + 'if ! istore_runtime_env; then echo "[agentflow] Failed to initialize the shared runtime environment" >&2; exit 1; fi', + "set -u", + "export MISE_YES=1", + 'echo "[agentflow] Downloading installer: $installer_url"', + 'if command -v wget >/dev/null 2>&1; then', + '\twget -O "$installer" "$installer_url"', + 'elif command -v curl >/dev/null 2>&1; then', + '\tcurl -fL -o "$installer" "$installer_url"', + 'elif command -v uclient-fetch >/dev/null 2>&1; then', + '\tuclient-fetch -O "$installer" "$installer_url"', + "else", + '\techo "[agentflow] No HTTPS download tool is available" >&2', + "\texit 1", + "fi", + 'if [ ! -s "$installer" ]; then echo "[agentflow] Failed to download the agent installer" >&2; exit 1; fi', + 'chmod 0700 "$installer"', + 'echo "[agentflow] Running installapp-mise.sh for $agent in $HOME"', + '/bin/sh "$installer" "$agent"' + }, "\n") + if not fs.writefile(task_script, install_script .. "\n") then + write_json({ ok = false, error = "failed to create install task", task_id = task_id }) + return + end + if sys.call("chmod 0600 " .. util.shellquote(task_script)) ~= 0 then + fs.unlink(task_script) + write_json({ ok = false, error = "failed to secure install task", task_id = task_id }) + return + end + + local command = "/bin/sh " .. util.shellquote(task_script) + local rc = sys.call("/etc/init.d/tasks task_add " .. task_id .. " " .. util.shellquote(command) .. " >/dev/null 2>&1") + if rc ~= 0 then + fs.unlink(task_script) + write_json({ ok = false, error = "failed to start install task", task_id = task_id }) + return + end + + write_json({ ok = true, task_id = task_id }) +end + function agentflow_open() compat():open("agentflow") end diff --git a/luci-app-agentflow/tests/test_agent_install_contract.py b/luci-app-agentflow/tests/test_agent_install_contract.py index 15f0ed992..f122a2a53 100644 --- a/luci-app-agentflow/tests/test_agent_install_contract.py +++ b/luci-app-agentflow/tests/test_agent_install_contract.py @@ -61,6 +61,32 @@ class AgentInstallContractTest(unittest.TestCase): self.assertIn('installButton.disabled = !available || installed', status) self.assertIn('installed ? agentflowLabels.installed : agentflowLabels.install', status) + def test_status_requires_valid_package_and_healthy_mise_shim(self): + controller = self.read("luasrc/controller/agentflow.lua") + + for agent_id, package, command in ( + ("codexcli", "@openai/codex", "codex"), + ("claude-code", "@anthropic-ai/claude-code", "claude"), + ("opencode", "opencode-ai", "opencode"), + ("kimi", "@moonshot-ai/kimi-code", "kimi"), + ("reasonix", "reasonix", "reasonix"), + ): + self.assertIn( + f'{{ id = "{agent_id}", package = "{package}", command = "{command}" }}', + controller, + ) + self.assertIn('probe_prefix="/tmp/agentflow-agent-probe.$$"', controller) + self.assertIn('[ -x "$shim" ]', controller) + self.assertIn('"$shim" --version', controller) + self.assertIn('sleep 5', controller) + self.assertIn('kill "$child_pid"', controller) + self.assertIn('type(package_json.version) == "string"', controller) + self.assertIn('package_json.version ~= ""', controller) + self.assertIn('command_ready[agent.id] == true', controller) + self.assertIn( + 'if package_valid and command_ready[agent.id] == true then', controller + ) + def test_modal_theme_prefers_body_attribute_then_system_theme(self): status = self.read("luasrc/view/agentflow/status.htm") diff --git a/luci-app-agentflow/tests/test_agentflow_luci_open_contract.py b/luci-app-agentflow/tests/test_agentflow_luci_open_contract.py index 3567d3e6b..e907bc893 100644 --- a/luci-app-agentflow/tests/test_agentflow_luci_open_contract.py +++ b/luci-app-agentflow/tests/test_agentflow_luci_open_contract.py @@ -3,6 +3,7 @@ import unittest APP_DIR = Path(__file__).resolve().parents[1] +META_MAKEFILE = APP_DIR.parent / "app-meta-agentflow/Makefile" class AgentFlowLuciOpenContractTest(unittest.TestCase): @@ -13,9 +14,12 @@ class AgentFlowLuciOpenContractTest(unittest.TestCase): makefile = self.read("Makefile") controller = self.read("luasrc/controller/agentflow.lua") status = self.read("luasrc/view/agentflow/status.htm") + meta = META_MAKEFILE.read_text(encoding="utf-8") self.assertIn("+luci-lib-linkeaseauth", makefile) self.assertIn("+linkease-app-entry", makefile) + self.assertIn("PKG_RELEASE:=3", meta) + self.assertIn("META_LUCI_ENTRY:=/cgi-bin/luci/admin/services/agentflow", meta) self.assertIn('entry({"admin", "services", "agentflow", "open"}', controller) self.assertIn("open.sysauth = false", controller) self.assertIn("function agentflow_open()", controller) diff --git a/luci-app-passwall/Makefile b/luci-app-passwall/Makefile index cea06daa6..7bc503f69 100644 --- a/luci-app-passwall/Makefile +++ b/luci-app-passwall/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall PKG_VERSION:=26.9.16 -PKG_RELEASE:=288 +PKG_RELEASE:=289 PKG_PO_VERSION:=$(PKG_VERSION) PKG_CONFIG_DEPENDS:= \ diff --git a/luci-app-passwall/luasrc/model/cbi/passwall/client/acl_config.lua b/luci-app-passwall/luasrc/model/cbi/passwall/client/acl_config.lua index 68a72d4af..aeb5febce 100644 --- a/luci-app-passwall/luasrc/model/cbi/passwall/client/acl_config.lua +++ b/luci-app-passwall/luasrc/model/cbi/passwall/client/acl_config.lua @@ -528,7 +528,7 @@ o.default = 0 o.rmempty = false o:depends({ _acl_node_bool = "1", _diff_global_node = "1" }) -o = s:taboption("Log", ListValue, "loglevel", "Sing-Box/Xray " .. translate("Log Level")) +o = s:taboption("Log", ListValue, "loglevel", translate("Log Level")) o.default = "warn" o:value("debug", "Debug") o:value("info", "Info") diff --git a/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua b/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua index bebd42542..cfd8b1b07 100644 --- a/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua +++ b/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua @@ -645,7 +645,7 @@ o = s:taboption("log", Flag, "log_node", translate("Enable Node Log")) o.default = "0" o.rmempty = false -o = s:taboption("log", ListValue, "loglevel", "Sing-Box/Xray " .. translate("Log Level")) +o = s:taboption("log", ListValue, "loglevel", translate("Log Level")) o.default = "warn" o:value("debug", "Debug") o:value("info", "Info") diff --git a/luci-app-passwall/luasrc/passwall/util_shadowsocks.lua b/luci-app-passwall/luasrc/passwall/util_shadowsocks.lua index 1f5a98dbc..312ce1a47 100644 --- a/luci-app-passwall/luasrc/passwall/util_shadowsocks.lua +++ b/luci-app-passwall/luasrc/passwall/util_shadowsocks.lua @@ -55,6 +55,7 @@ function gen_config(var) local local_http_password = var["local_http_password"] local local_redir_port = var["local_redir_port"] local local_redir_address = var["local_redir_address"] or "0.0.0.0" + local loglevel = var["loglevel"] if api.is_ipv6(server_host) then server_host = api.get_ipv6_only(server_host) @@ -100,7 +101,10 @@ function gen_config(var) } }, locals = {}, - fast_open = (node.tcp_fast_open and node.tcp_fast_open == "1") and true or false + fast_open = (node.tcp_fast_open and node.tcp_fast_open == "1") and true or false, + log = { + level = (loglevel == "debug") and 1 or 0 + } } if local_socks_address and local_socks_port then table.insert(config.locals, { diff --git a/luci-app-passwall/root/usr/share/passwall/app.sh b/luci-app-passwall/root/usr/share/passwall/app.sh index 10bfbd08f..334771cc8 100755 --- a/luci-app-passwall/root/usr/share/passwall/app.sh +++ b/luci-app-passwall/root/usr/share/passwall/app.sh @@ -94,7 +94,7 @@ run_singbox() { [ "$type" != "sing-box" ] && [ -n "$SINGBOX_BIN" ] && type="sing-box" } [ -z "$type" ] && return 1 - [ -n "$log_file" ] || local log_file="/dev/null" + [ -n "$log_file" ] || log_file="/dev/null" json_init if [ "$log_file" = "/dev/null" ]; then json_add_string "log" "0" @@ -102,7 +102,7 @@ run_singbox() { json_add_string "log" "1" json_add_string "logfile" "${log_file}" fi - [ -z "$loglevel" ] && local loglevel=$(config_n_get @global[0] loglevel "warn") + [ -z "$loglevel" ] && loglevel=$(config_n_get @global[0] loglevel "warn") json_add_string "loglevel" "$loglevel" [ -n "$flag" ] && json_add_string "flag" "$flag" @@ -213,8 +213,8 @@ run_xray() { } [ -z "$type" ] && return 1 json_init - [ -n "$log_file" ] || local log_file="/dev/null" - [ -z "$loglevel" ] && local loglevel=$(config_n_get @global[0] loglevel "warning") + [ -n "$log_file" ] || log_file="/dev/null" + [ -z "$loglevel" ] && loglevel=$(config_n_get @global[0] loglevel "warning") [ -n "$flag" ] && json_add_string "flag" "$flag" [ -n "$node" ] && json_add_string "node" "$node" [ -n "$use_proxy_list" ] && json_add_string "use_proxy_list" "$use_proxy_list" @@ -340,7 +340,7 @@ run_chinadns_ng() { } run_socks() { - local flag node bind socks_port config_file http_port http_config_file relay_port log_file no_run + local flag node bind socks_port config_file http_port http_config_file relay_port log_file no_run loglevel eval_set_val "$@" [ -n "$config_file" ] && [ -z "$(echo ${config_file} | grep $TMP_PATH)" ] && config_file=$TMP_PATH/$config_file [ -n "$http_port" ] || http_port=0 @@ -350,6 +350,7 @@ run_socks() { elif [ "${log_file#"$TMP_PATH/"}" = "$log_file" ]; then log_file=$TMP_PATH/$log_file fi + loglevel=${loglevel:-warn} local type=$(echo $(config_n_get $node type) | tr 'A-Z' 'a-z') local remarks=$(config_n_get $node remarks) @@ -442,7 +443,7 @@ run_socks() { } [ -n "$relay_port" ] && _args="${_args} server_host=$server_host server_port=$server_port" [ -n "$no_run" ] && _args="${_args} no_run=1" - run_singbox flag=$flag node=$node socks_address=$bind socks_port=$socks_port config_file=$config_file log_file=$log_file ${_args} + run_singbox flag=$flag node=$node socks_address=$bind socks_port=$socks_port config_file=$config_file log_file=$log_file loglevel=$loglevel ${_args} ;; xray) [ "$http_port" != "0" ] && { @@ -452,7 +453,7 @@ run_socks() { } [ -n "$relay_port" ] && _args="${_args} server_host=$server_host server_port=$server_port" [ -n "$no_run" ] && _args="${_args} no_run=1" - run_xray flag=$flag node=$node socks_address=$bind socks_port=$socks_port config_file=$config_file log_file=$log_file ${_args} + run_xray flag=$flag node=$node socks_address=$bind socks_port=$socks_port config_file=$config_file log_file=$log_file loglevel=$loglevel ${_args} ;; naiveproxy) json_add_string "run_type" "socks" @@ -480,6 +481,7 @@ run_socks() { } json_add_string "local_socks_address" "$bind" json_add_string "local_socks_port" "$socks_port" + json_add_string "loglevel" "$loglevel" lua $UTIL_SS gen_config "$(json_dump)" > $config_file [ -n "$no_run" ] || ln_run "$(first_type sslocal)" "sslocal" $log_file -c "$config_file" -v ;; @@ -493,7 +495,10 @@ run_socks() { json_add_string "local_socks_address" "$bind" json_add_string "local_socks_port" "$socks_port" lua $UTIL_HYSTERIA2 gen_config "$(json_dump)" > $config_file - [ -n "$no_run" ] || ln_run "$(first_type $(config_n_get @global_app[0] hysteria_file))" "hysteria" $log_file -c "$config_file" client + [ -n "$no_run" ] || { + HYSTERIA_LOG_LEVEL="$loglevel" \ + ln_run "$(first_type "$(config_n_get @global_app[0] hysteria_file)")" "hysteria" $log_file -c "$config_file" client + } ;; esac @@ -792,6 +797,7 @@ start_global() { } local plugin_sh="${config_file%.json}_plugin.sh" json_add_string "plugin_sh" "$plugin_sh" + json_add_string "loglevel" "$(config_n_get @global[0] loglevel "warn")" lua $UTIL_SS gen_config "$(json_dump)" > $config_file ln_run "$(first_type sslocal)" "sslocal" $log_file -c "$config_file" -v ;; @@ -808,7 +814,9 @@ start_global() { } json_add_string "tcp_proxy_way" "${TCP_PROXY_WAY}" lua $UTIL_HYSTERIA2 gen_config "$(json_dump)" > $config_file - ln_run "$(first_type $(config_n_get @global_app[0] hysteria_file))" "hysteria" $log_file -c "$config_file" client + local loglevel=$(config_n_get @global[0] loglevel "warn") + HYSTERIA_LOG_LEVEL="$loglevel" \ + ln_run "$(first_type "$(config_n_get @global_app[0] hysteria_file)")" "hysteria" $log_file -c "$config_file" client ;; esac if [ -n "${_socks_flag}" ]; then @@ -1630,7 +1638,7 @@ acl_app() { run_${type} flag=$node node=$node redir_port=$redir_port ${_extra_param} config_file=$config_file log_file=$log_file loglevel=$loglevel else config_file="acl/${node}_SOCKS_${socks_port}.json" - run_socks flag=$node node=$node bind=127.0.0.1 socks_port=$socks_port config_file=$config_file log_file=$log_file + run_socks flag=$node node=$node bind=127.0.0.1 socks_port=$socks_port config_file=$config_file log_file=$log_file loglevel=$loglevel # log_file=$TMP_ACL_PATH/ipt2socks_${node}_${redir_port}.log log_file="/dev/null" run_ipt2socks flag=acl_${node} tcp_tproxy=${is_tproxy} local_port=$redir_port socks_address=127.0.0.1 socks_port=$socks_port log_file=$log_file diff --git a/luci-theme-argon/Makefile b/luci-theme-argon/Makefile index 6db1ae4f3..8a36c7dfb 100644 --- a/luci-theme-argon/Makefile +++ b/luci-theme-argon/Makefile @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk LUCI_TITLE:=Argon Theme LUCI_DEPENDS:=+USE_APK:wget-any +!USE_APK:wget +jsonfilter PKG_VERSION:=2.4.7 -PKG_RELEASE:=19 +PKG_RELEASE:=20 CONFIG_LUCI_CSSTIDY:= diff --git a/luci-theme-argon/htdocs/luci-static/argon/css/dark.css b/luci-theme-argon/htdocs/luci-static/argon/css/dark.css index 134d0926b..10c6b8c39 100644 --- a/luci-theme-argon/htdocs/luci-static/argon/css/dark.css +++ b/luci-theme-argon/htdocs/luci-static/argon/css/dark.css @@ -1 +1,2 @@ -body{background:#1e1e1e;color:#ccc}.spinning::before{filter:invert(1)}.login-page .login-container{background-color:rgba(0,0,0,var(--blur-opacity-dark));-webkit-backdrop-filter:blur(var(--blur-radius-dark));backdrop-filter:blur(var(--blur-radius-dark))}.login-page .login-container .login-form{background-color:transparent;-webkit-backdrop-filter:none;backdrop-filter:none}.login-page .login-container .login-form .brand{color:#adb5bd}.login-page .login-container .login-form .form-login .input-group::before{color:#adb5bd}.login-page .login-container .login-form .form-login .input-group input{background-color:transparent!important;color:#adb5bd;border-bottom:#adb5bd 1px solid!important;border-radius:0!important;border-top:none!important;border-left:none!important;border-right:none!important;box-shadow:none}.login-page .login-container .login-form .form-login .cbi-button-apply{background-color:#483d8b!important;background-color:var(--dark-primary)!important}.login-page .login-container .login-form .form-login .cbi-button-apply:focus,.login-page .login-container .login-form .form-login .cbi-button-apply:hover{opacity:.9}header::after{background-color:#1e1e1e!important}.main .main-left{background-color:#333!important;box-shadow:0 0 .5rem 0 rgba(0,0,0,.15)}.main .main-left .sidenav-header .brand{color:#ccc}.main .main-left .nav .slide .slide-menu .active a{color:#ccc}.main .main-left .nav .slide .slide-menu .active a::after{background-color:#ccc!important}.main .main-left .nav .slide .slide-menu .active::after{background-color:var(--dark-primary)!important}.main .main-left .nav .slide .slide-menu li a{color:#ccc}.main .main-left .nav .slide .slide-menu li a:hover{background:0 0!important}.main .main-left .nav .slide .slide-menu li::after{background-color:var(--dark-primary)!important}.main .main-left .nav .slide .menu.active{background-color:#483d8b!important;background-color:var(--dark-primary)!important;color:#fff!important}.main .main-left .nav .slide .menu.active a::after{background-color:#fff!important}.main .main-left .nav li a{color:#ccc!important}.main .main-left .nav li a:hover{background-color:#483d8b!important;background-color:var(--dark-primary)!important;color:#fff!important}.main .main-left::-webkit-scrollbar-thumb{background-color:#252526!important}.main .main-left::-webkit-scrollbar-track{background-color:#333}.main .main-right{background-color:#1e1e1e}h2{color:#ccc;background:#333}h3{color:#ccc;border-bottom:0;background:#333}h4{color:#8c6900}abbr{color:var(--dark-primary)!important}a:active,a:link,a:visited{color:#a5b2ff}input:-webkit-autofill{background-color:#3c3c3c!important}#channel_graph{background-color:transparent!important}.cbi-button-apply,.cbi-button-edit,.cbi-value-field .cbi-input-apply{color:#fff!important;background-color:#483d8b!important;background-color:var(--dark-primary)!important;border-color:#483d8b!important;border-color:var(--dark-primary)!important}.cbi-section em{color:#ccc}header.bg-primary{background-color:#1e1e1e!important}.cbi-map-descr{color:#ccc}.cbi-section{background:0 0;box-shadow:0 0 .5rem 0 rgba(0,0,0,.35)}.panel-title{color:#ccc;background-color:#333}div>.table>.tr:nth-of-type(2n),div>table>tbody>tr:nth-of-type(2n){background-color:#252526}table>tbody>tr>td,table>tfoot>tr>td,table>thead>tr>td{color:#ccc}fieldset>table>tbody>tr:nth-of-type(2n){background-color:#252526}table>tbody>tr>td,table>tfoot>tr>td,table>thead>tr>td{border-top:1px solid #252526}#conns>div>div,#membuff>div>div,#memfree>div>div,#memtotal>div>div,#swapfree>div>div,#swaptotal>div>div{background-color:var(--dark-primary)!important}#conns>div>div>div>small,#membuff>div>div>div>small,#memfree>div>div>div>small,#memtotal>div>div>div>small,#swapfree>div>div>div>small,#swaptotal>div>div>div>small{color:#ccc!important}.node-system-packages>.main .cbi-section-node:first-child .cbi-value-last{line-height:1.8em}.node-system-packages>.main .cbi-section-node:first-child .cbi-value-last div[style="margin:3px 0; width:300px; height:10px; border:1px solid #000000; background-color:#80C080"]{border:1px solid #999!important;background-color:transparent!important}.node-system-packages>.main .cbi-section-node:first-child .cbi-value-last div[style="margin:3px 0; width:300px; height:10px; border:1px solid #000000; background-color:#80C080"] div{background-color:#ba8b00!important}table>tbody>tr>th,table>tfoot>tr>th,table>thead>tr>th{background-color:#252526;border-bottom:#000 1px solid!important}.tr.cbi-section-table-titles.named::before,.tr[data-title]::before{background-color:#252526}#cbi-wireless>#wifi_assoclist_table>.tr:nth-child(2),.cbi-section-table-row::before,.tr>.td,.tr>.th,tr>td,tr>th{border-top:0}.cbi-rowstyle-2{background-color:#1e1e1e}.cbi-rowstyle-1{background-color:#252526}.cbi-rowstyle-2 .cbi-button-down,.cbi-rowstyle-2 .cbi-button-up,body:not(.Interfaces) .cbi-rowstyle-2:first-child{background-color:#666!important}.cbi-section>h3:first-child,.panel-title,h3{color:#ccc}h4{background-color:#1e1e1f}.cbi-progressbar{background:#282a2c}.cbi-progressbar div{background-color:var(--dark-primary)!important}.cbi-section-table .cbi-section-table-titles .cbi-section-table-cell{background-color:#1e1e1f}.cbi-button{color:#fff!important;background-color:#483d8b;background-color:var(--dark-primary)}.cbi-section-node{background:0 0}abbr{color:#5e72e4}div>.table>.tbody>.tr:nth-of-type(2n),div>table>tbody>tr:nth-of-type(2n){background-color:#252526}#content_syslog{box-shadow:0 0 .5rem 0 rgba(0,0,0,.35)}#syslog{color:#ccc;background-color:#1e1e1e}#bwsvg,#iwsvg,#iwsvg2{overflow:hidden;box-shadow:0 0 .5rem 0 rgba(0,0,0,.35);background-color:#1e1e1e!important}.tabs{background-color:#252526}.tabs li:hover,.tabs li[class~=active]{cursor:pointer;color:#ccc!important}.tabs li:hover a,.tabs li[class~=active] a{color:#ccc!important}.tabs>li[class~=active]>a{color:#ccc}.tabs>li:hover,.tabs>li[class~=active]{border-bottom:.18751rem solid #483d8b;border-bottom:.18751rem solid var(--dark-primary);color:var(--dark-primary)!important;background-color:#181819}.cbi-tabmenu>li>a,.tabs>li>a{color:#ccc}.cbi-tabmenu>li>a:hover,.tabs>li>a:hover{color:#ccc}.cbi-tabmenu>li{background:#2d2d2d}.cbi-tabmenu li[class~=cbi-tab] a{color:#ccc}.cbi-tabmenu>li:hover{color:#ccc;background:#2d2d2d;border-bottom:.18751rem solid var(--dark-primary)!important}.cbi-tabmenu>li[class~=cbi-tab]{background-color:#181819;border-bottom:.18751rem solid var(--dark-primary)!important}.cbi-tabcontainer>.cbi-value:nth-of-type(2n){background-color:#252526}.cbi-value-title{color:#ccc}input,select{color:#ccc;background-color:transparent!important;border:1px solid #252526;box-shadow:none}input:focus,select:not([multiple=multiple]):focus{border-color:#483d8b!important;border-color:var(--dark-primary)!important;outline:0}.cbi-dropdown:focus,input:not(.cbi-button):focus,select:not([multiple=multiple]):focus{border-color:#5e72e4;border-color:var(--dark-primary)!important}select{background-color:#1e1e1e!important}#cbi-customfeedconf .cbi-map-descr,#cbi-customfeedconf h2,#cbi-distfeedconf .cbi-map-descr,#cbi-distfeedconf h2,#cbi-download h2,#cbi-dropbear .cbi-map-descr,#cbi-dropbear .cbi-map-descr abbr,#cbi-dropbear h2,#cbi-filelist h2,#cbi-rc .cbi-map-descr,#cbi-rc h2{color:#ccc!important}.cbi-value-field>ul>li .ifacebadge{background-color:#3c3c3c}.cbi-section-descr{color:#ccc}.cbi-input-textarea{background-color:#1e1e1e;color:#ccc;border:1px solid #3c3c3c!important}textarea:focus-visible{border:1px solid var(--dark-primary)}.cbi-section-node:nth-of-type(2n),.cbi-section-remove:nth-of-type(2n){background-color:#1e1e1e}.cbi-section[id] .cbi-section-node:nth-of-type(4n+4),.cbi-section[id] .cbi-section-remove:nth-of-type(4n+3){background-color:#1e1e1e}.node-system-packages>.main table tr td:last-child{color:#ccc}.cbi-tooltip{background-color:var(--primary);color:#fff}.ifacebox{background-color:transparent!important;border:1px solid #1e1e1e}.ifacebox-head{color:#ccc;background:#666}.ifacebox-body{background-color:#333}.zonebadge strong{color:#333}.zonebadge>.ifacebadge{background-color:#3c3c3c}div.cbi-value var,td.cbi-value-field var{color:#5e72e4}#diag-rc-output>pre{color:#ccc;background-color:#1e1e1e}.node-services-vssr .block{background-color:#3c3c3c!important;box-shadow:0 0 .5rem 0 rgba(0,0,0,.35)}.node-services-vssr .block h4{color:#ccc!important}.node-services-vssr .status-bar{color:#ccc;box-shadow:0 0 .5rem 0 rgba(0,0,0,.35);background-color:#1e1e1e}.node-services-vssr .cbi-section-table-row{color:#ccc;background-color:#3c3c3c!important;box-shadow:0 0 5px 0 rgba(0,0,0,.35)}.node-services-vssr .cbi-section-table-row.fast{background:#483d8b!important;background:var(--dark-primary)!important;color:#fff}.node-services-vssr .ssr-button{color:#ccc}.node-services-vssr .incon:nth-child(2){border-right:#1e1e1e 1px solid}#xhr_poll_status>.label.success{color:#ccc!important;background-color:#556b2f!important}.notice{background-color:#483d8b!important;background-color:var(--dark-primary)!important}.cbi-section.fade-in .cbi-title>div:last-child span{background:0 0!important;color:#ced4da}.cbi-button-add,.cbi-button-find,.cbi-button-reload,.cbi-button-save,.cbi-input-find,.cbi-input-reload,.cbi-input-save{color:#fff!important;background:#556b2f!important;border-color:#556b2f!important}.cbi-button-reset,.cbi-input-remove{color:#fff!important;background-color:#ff8c00!important;border-color:#ff8c00!important}.cbi-button-action.important,.cbi-button-apply.important,.cbi-button-edit.important,.cbi-button-reload.important,.cbi-page-actions .cbi-button-apply,.cbi-section-actions .cbi-button-edit{border:1px #483d8b solid!important;border:1px var(--dark-primary) solid!important}.btn[value=Dismiss],.cbi-button-neutral[value=Disable],.cbi-button[onclick="handleReset(event)"],.cbi-button[onclick^=iface_reconnect],.cbi-button[value=Disabled],.cbi-button[value=Reset],.cbi-button[value=Terminate]{color:#fff;border:thin solid #ff8c00!important;background-color:#ff8c00!important}fieldset[id^=cbi-apply-]{background-color:#333}#detail-bubble>div{border:1px solid #ccc;background:#252525}.ifacebox-head.active{background-color:var(--dark-primary)!important}header .fill .status span[data-style=active]{color:#ccc!important;background-color:#556b2f!important}#cbi-network .tr:first-child>.td,#cbi-wireless .td,.table[width="100%"]>.tr:first-child>.td,.tr.cbi-section-table-titles>.th,.tr.table-titles>.th,[data-page=admin-network-diagnostics] .tr>.td{background-color:#252526;border-bottom:#000 1px solid!important}.network-status-table .ifacebox-body .ifacebadge{background-color:#252526;border-bottom:0;box-shadow:none}.td>.ifacebadge,td>.ifacebadge{color:#fff;background-color:#483d8b;background-color:var(--dark-primary);border:0}.alert,.alert-message{background-color:#333}.alert-message.warning{background-color:#986400!important}.alert-message.error,.alert.error{background-color:#784f00}.alert h4,.alert-message h4{background-color:#784f00;color:#ffbf00}.alert-message [class=btn]{background-color:#777;color:#ccc}.uci-dialog .cbi-section .uci-change-legend .uci-change-legend-label>ins{border-color:#00ad00;background-color:#688668}.uci-dialog .cbi-section .uci-change-legend .uci-change-legend-label>del{border-color:#c60000;background-color:#896565}.uci-dialog .cbi-section .uci-change-legend .uci-change-legend-label>var{background-color:#333;border-color:#666}.uci-dialog .cbi-section .uci-change-legend .uci-change-legend-label>var ins{background-color:#688668}.uci-dialog .cbi-section .uci-change-legend .uci-change-legend-label>var del{background-color:#896565}.uci-dialog .cbi-section .uci-change-list>var{background-color:#333;border-color:#666}.uci-dialog .cbi-section .uci-change-list>var del{background-color:#896565}.uci-dialog .cbi-section .uci-change-list>var ins{background-color:#688668}.uci-dialog .cbi-section .uci-change-list>ins{border-color:#00ad00;background-color:#688668}.uci-dialog .cbi-section .uci-change-list>del{border-color:#c60000;background-color:#896565}.uci-dialog .cbi-section .uci-change-list+.right .btn{color:#ccc}.uci-dialog .cbi-section .uci-change-list+.right .cbi-button{border:1px solid #3c3c3c!important}.btn.danger,.cbi-button-negative,.cbi-button-neutral[value=Restart],.cbi-button-remove,.cbi-button-reset,.cbi-button[onclick="reboot(this)"],.cbi-button[value=Kill],.cbi-button[value=Stop],.cbi-section-remove>.cbi-button{border:thin solid #ff8c00!important;background-color:#ff8c00!important}#cbi-network>.cbi-section-node,#cbi-wireless>#wifi_assoclist_table,#cbi-wireless>.cbi-section-node,#iptables,.Firewall form,.cbi-section,.cbi-section-error,[data-page=admin-system-opkg] #maincontent>.container,[data-page^=admin-system-admin]:not(.node-main-login) .cbi-map:not(#cbi-dropbear),[data-tab-title]{background:#1e1e1e!important;box-shadow:0 0 .5rem 0 rgba(0,0,0,.35)}div[style="width:100%;height:300px;border:1px solid #000;background:#fff"]{background:0 0!important}[data-page=admin-system-admin-password] .cbi-map .cbi-map-descr,[data-page=admin-system-admin-password] .cbi-map h2,[data-page=admin-system-admin] .cbi-map .cbi-map-descr,[data-page=admin-system-admin] .cbi-map h2{color:#ccc}[data-page=admin-system-flash] .modal label>input[type=checkbox]{vertical-align:text-top;top:auto;border-color:#fff!important}[data-page=admin-system-flash] .modal .btn{white-space:normal!important;background-color:#8fbc8f}[data-page=admin-system-flash] .modal .alert-message{background-color:transparent!important}[data-page=admin-system-flash] .modal .danger{border:thin solid #ff8c00!important;background-color:#ff8c00!important}.cbi-value input[type=password]+.cbi-button-neutral{background-color:#483d8b!important;background-color:var(--dark-primary)!important;border-color:var(--dark-primary)!important}.btn,.cbi-dropdown,button,input,select{border:1px solid #3c3c3c!important}.cbi-dropdown .preview{color:#ccc}.cbi-section-table-row{background-color:#1e1e1e!important}.modal{background-color:#1e1e1e}.cbi-button-positive{color:#fff!important;background-color:#556b2f!important}[data-page=admin-system-flash] legend{color:#ccc}.logout:before{color:#adb5bd!important}.cbi-dropdown[open]{border-color:#483d8b!important;border-color:var(--dark-primary)!important}.cbi-dropdown[open]>ul.dropdown{background:#252526!important;color:#fff!important;box-shadow:none;border:1px solid #3c3c3c!important}.cbi-dropdown[open]>ul.dropdown li{color:#fff;border-bottom:1px solid #3c3c3c!important}.cbi-dropdown[open]>ul.dropdown>li[selected]{background-color:#483d8b!important;background-color:var(--dark-primary)!important;border-bottom:1px solid #3c3c3c!important}.cbi-dropdown[open]>ul.dropdown>li.focus{background:#483d8b;background:var(--dark-primary);outline:0}.ifacebadge{background-color:#333}.cbi-dynlist>.item>span{border:1px solid #3c3c3c!important}.cbi-button-action,.cbi-button-apply,.cbi-button-edit,.cbi-button-reload,.cbi-button[onclick="addKey(event)"],.cbi-button[value$=Apply],.cbi-button[value=Submit],.cbi-button[value=Upload],.cbi-page-actions .cbi-button-apply,.cbi-section-actions .cbi-button-edit{background:#483d8b!important;background:var(--dark-primary)!important;border-color:var(--dark-primary)!important}.btn.primary,.cbi-button-add,.cbi-button-link,.cbi-button-neutral[onclick="handleConfig(event)"],.cbi-button-positive,.cbi-button-save,.cbi-button[value=Enable],.cbi-button[value=Scan],.cbi-button[value^=Back],.cbi-page-actions .cbi-button-apply+.cbi-button-save,.cbi-page-actions .cbi-button-save{background:#483d8b;background:var(--dark-primary)}[data-page=admin-system-opkg] h2{color:#ccc!important}[data-page=admin-system-startup] textarea{color:#ccc;background-color:transparent}[data-page=admin-system-startup] textarea:focus-visible{border:1px solid var(--dark-primary)}[data-page=admin-network-firewall-custom] #view p textarea,[data-page=admin-status-routes] #view p textarea,[data-page=admin-system-crontab] #view p textarea{color:#ccc;background-color:transparent}#view>.spinning{background:#333!important;box-shadow:0 4px 8px rgba(0,0,0,.03)!important}@media screen and (min-width:600px){::-webkit-scrollbar-thumb{background:var(--dark-primary)}::-webkit-scrollbar-thumb:hover{background:var(--dark-primary)}::-webkit-scrollbar-thumb:active{background:var(--dark-primary)}}@media screen and (max-width:480px){.node-status-iptables>.main div>.cbi-map>form{background-color:#1e1e1e;box-shadow:0 0 .5rem 0 rgba(0,0,0,.35)}}[data-page=""] .main-right>#maincontent .Dashboard,[data-page=admin-status-dashboard] .main-right>#maincontent .Dashboard{color:#ccc!important}[data-page=""] .main-right>#maincontent .Dashboard h3,[data-page=admin-status-dashboard] .main-right>#maincontent .Dashboard h3{color:#ccc}[data-page=""] .main-right>#maincontent .Dashboard hr,[data-page=admin-status-dashboard] .main-right>#maincontent .Dashboard hr{border-top:1px solid #fff}[data-page=""] .main-right>#maincontent .Dashboard .dashboard-bg,[data-page=admin-status-dashboard] .main-right>#maincontent .Dashboard .dashboard-bg{background-color:#333}[data-page=""] .main-right>#maincontent .Dashboard img.svgmonochrome,[data-page=admin-status-dashboard] .main-right>#maincontent .Dashboard img.svgmonochrome{filter:invert(90%)}[data-page=""] .main-right>#maincontent .Dashboard tr,[data-page=admin-status-dashboard] .main-right>#maincontent .Dashboard tr{border-top:thin solid #4d4d4d}[data-page=""] .main-right>#maincontent .Dashboard tr:last-child,[data-page=admin-status-dashboard] .main-right>#maincontent .Dashboard tr:last-child{border-bottom:thin solid #4d4d4d}[data-page=admin-system-fileassistant] .fb-container .panel-container{border-bottom-color:#3c3c3c!important}[data-page=admin-system-fileassistant] .fb-container td[class$="-icon"]::before{filter:invert(.7)}[data-page=admin-system-fileassistant] div#list-content table.cbi-section-table tbody tr:first-child td.parent-icon{background:#1e1e1e!important}[data-page^=admin-services-openclash]{--oc-accent:var(--dark-primary);--oc-surface:#1e1e1e;--oc-surface-muted:#252526;--oc-control-bg:#1e1e1e;--oc-border:#3c3c3c;--oc-text:#ccc;--oc-text-muted:#a1a1aa;--oc-neutral:#5b5b5b;--oc-scrollbar:#5b5b5b}[data-page^=admin-services-openclash] img[src$="arrow-clockwise-light.svg"],[data-page^=admin-services-openclash] img[src$="eye-light.svg"],[data-page^=admin-services-openclash] img[src$="wrench-light.svg"]{filter:invert(.9)}[data-page=admin-network-diagnostics] .cbi-section{background:#252526!important}[data-page=admin-network-diagnostics] textarea{background:0 0;border-radius:.25rem;color:#ccc;border:1px solid #3c3c3c!important}[data-page=admin-network-diagnostics] .tr>.td{background-color:#252526!important}[data-page=admin-network-network] .ifacebox-head[style*="--zone-color-rgb: 144, 240, 144"]{background-color:#497e49!important;color:#ccc!important}[data-page=admin-network-network] .ifacebox-head[style*="--zone-color-rgb: 240, 144, 144;"]{background-color:#9c4f4f!important;color:#ccc!important}[data-page=admin-network-network] .ifacebox-head[style*="--zone-color-rgb: 238, 238, 238;"]{background-color:#666!important}[data-page=admin-network-network] #modal_overlay>.modal.cbi-modal>div>p>textarea{border:1px solid #3c3c3c!important;background-color:transparent!important}[data-page=admin-network-network] #modal_overlay div[data-tab=peers] div[data-name="_peers"] .ifacebadge code{color:#fff!important;background-color:transparent!important}[data-page=admin-network-network] #modal_overlay>.modal.cbi-modal>div>p>textarea{color:#ccc!important}[data-page=admin-network-firewall-rules] #cbi-firewall-rule .zonebadge[style*="--zone-color-rgb:240, 144, 144;"]{--zone-color-rgb:156,79,79!important}[data-page=admin-network-firewall-rules] #cbi-firewall-rule .zonebadge[style*="--zone-color-rgb:240, 144, 144;"] strong{color:#ccc!important}[data-page=admin-network-firewall-rules] #cbi-firewall-rule .zonebadge[style*="--zone-color-rgb:238, 238, 238;"]{--zone-color-rgb:112,112,112!important}[data-page=admin-network-firewall-rules] #cbi-firewall-rule .zonebadge[style*="--zone-color-rgb:238, 238, 238;"] em{color:#ccc!important}[data-page=admin-network-firewall-rules] #cbi-firewall-rule>table>.cbi-section-table-row[data-title]::before{background-color:#252526!important}[data-page=admin-network-firewall-rules] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:240, 144, 144;"],[data-page=admin-network-network] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:240, 144, 144;"]{--zone-color-rgb:156,79,79!important;color:#ccc!important}[data-page=admin-network-firewall-rules] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:240, 144, 144;"] strong,[data-page=admin-network-network] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:240, 144, 144;"] strong{color:#ccc!important}[data-page=admin-network-firewall-rules] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:144, 240, 144;"],[data-page=admin-network-network] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:144, 240, 144;"]{--zone-color-rgb:73,126,73!important;color:#ccc!important}[data-page=admin-network-firewall-rules] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:144, 240, 144;"] strong,[data-page=admin-network-network] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:144, 240, 144;"] strong{color:#ccc!important}[data-page=admin-network-firewall-rules] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:238, 238, 238;"],[data-page=admin-network-network] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:238, 238, 238;"]{--zone-color-rgb:112,112,112!important}[data-page=admin-network-firewall-rules] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:238, 238, 238;"] strong,[data-page=admin-network-network] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:238, 238, 238;"] strong{color:#ccc!important}[data-page=admin-network-firewall-rules] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:238, 238, 238;"] strong+span,[data-page=admin-network-network] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:238, 238, 238;"] strong+span{color:#ccc!important}[data-page=admin-system-commands-dashboard] .commandbox,[data-page=admin-system-commands] .commandbox{border-bottom:thin solid #333;background:#252526;box-shadow:inset 0 1px 0 rgba(0,0,0,.2),0 1px 2px rgba(255,255,255,.05)}.btn{background-color:#707070;color:#fff}[data-page=admin-system-admin-repokeys] #key-input{background-color:#1e1e1e;color:#ccc;border:1px solid #3c3c3c!important}[data-page=admin-system-package-manager] #modal_overlay textarea{background-color:#1e1e1e;color:#ccc;border:1px solid #3c3c3c!important}.cbi-dropdown[open]>ul.dropdown>li[selected]{color:#fff} \ No newline at end of file +body{background:#1e1e1e;color:#ccc}.spinning::before{filter:invert(1)}.login-page .login-container{background-color:rgba(0,0,0,var(--blur-opacity-dark));-webkit-backdrop-filter:blur(var(--blur-radius-dark));backdrop-filter:blur(var(--blur-radius-dark))}.login-page .login-container .login-form{background-color:transparent;-webkit-backdrop-filter:none;backdrop-filter:none}.login-page .login-container .login-form .brand{color:#adb5bd}.login-page .login-container .login-form .form-login .input-group::before{color:#adb5bd}.login-page .login-container .login-form .form-login .input-group input{background-color:transparent!important;color:#adb5bd;border-bottom:#adb5bd 1px solid!important;border-radius:0!important;border-top:none!important;border-left:none!important;border-right:none!important;box-shadow:none}.login-page .login-container .login-form .form-login .cbi-button-apply{background-color:#483d8b!important;background-color:var(--dark-primary)!important}.login-page .login-container .login-form .form-login .cbi-button-apply:focus,.login-page .login-container .login-form .form-login .cbi-button-apply:hover{opacity:.9}header::after{background-color:#1e1e1e!important}.main .main-left{background-color:#333!important;box-shadow:0 0 .5rem 0 rgba(0,0,0,.15)}.main .main-left .sidenav-header .brand{color:#ccc}.main .main-left .nav .slide .slide-menu .active a{color:#ccc}.main .main-left .nav .slide .slide-menu .active a::after{background-color:#ccc!important}.main .main-left .nav .slide .slide-menu .active::after{background-color:var(--dark-primary)!important}.main .main-left .nav .slide .slide-menu li a{color:#ccc}.main .main-left .nav .slide .slide-menu li a:hover{background:0 0!important}.main .main-left .nav .slide .slide-menu li::after{background-color:var(--dark-primary)!important}.main .main-left .nav .slide .menu.active{background-color:#483d8b!important;background-color:var(--dark-primary)!important;color:#fff!important}.main .main-left .nav .slide .menu.active a::after{background-color:#fff!important}.main .main-left .nav li a{color:#ccc!important}.main .main-left .nav li a:hover{background-color:#483d8b!important;background-color:var(--dark-primary)!important;color:#fff!important}.main .main-left::-webkit-scrollbar-thumb{background-color:#252526!important}.main .main-left::-webkit-scrollbar-track{background-color:#333}.main .main-right{background-color:#1e1e1e}h2{color:#ccc;background:#333}h3{color:#ccc;border-bottom:0;background:#333}h4{color:#8c6900}abbr{color:var(--dark-primary)!important}a:active,a:link,a:visited{color:#a5b2ff}input:-webkit-autofill{background-color:#3c3c3c!important}#channel_graph{background-color:transparent!important}.cbi-button-apply,.cbi-button-edit,.cbi-value-field .cbi-input-apply{color:#fff!important;background-color:#483d8b!important;background-color:var(--dark-primary)!important;border-color:#483d8b!important;border-color:var(--dark-primary)!important}.cbi-section em{color:#ccc}header.bg-primary{background-color:#1e1e1e!important}.cbi-map-descr{color:#ccc}.cbi-section{background:0 0;box-shadow:0 0 .5rem 0 rgba(0,0,0,.35)}.panel-title{color:#ccc;background-color:#333}div>.table>.tr:nth-of-type(2n),div>table>tbody>tr:nth-of-type(2n){background-color:#252526}table>tbody>tr>td,table>tfoot>tr>td,table>thead>tr>td{color:#ccc}fieldset>table>tbody>tr:nth-of-type(2n){background-color:#252526}table>tbody>tr>td,table>tfoot>tr>td,table>thead>tr>td{border-top:1px solid #252526}#conns>div>div,#membuff>div>div,#memfree>div>div,#memtotal>div>div,#swapfree>div>div,#swaptotal>div>div{background-color:var(--dark-primary)!important}#conns>div>div>div>small,#membuff>div>div>div>small,#memfree>div>div>div>small,#memtotal>div>div>div>small,#swapfree>div>div>div>small,#swaptotal>div>div>div>small{color:#ccc!important}.node-system-packages>.main .cbi-section-node:first-child .cbi-value-last{line-height:1.8em}.node-system-packages>.main .cbi-section-node:first-child .cbi-value-last div[style="margin:3px 0; width:300px; height:10px; border:1px solid #000000; background-color:#80C080"]{border:1px solid #999!important;background-color:transparent!important}.node-system-packages>.main .cbi-section-node:first-child .cbi-value-last div[style="margin:3px 0; width:300px; height:10px; border:1px solid #000000; background-color:#80C080"] div{background-color:#ba8b00!important}table>tbody>tr>th,table>tfoot>tr>th,table>thead>tr>th{background-color:#252526;border-bottom:#000 1px solid!important}.tr.cbi-section-table-titles.named::before,.tr[data-title]::before{background-color:#252526}#cbi-wireless>#wifi_assoclist_table>.tr:nth-child(2),.cbi-section-table-row::before,.tr>.td,.tr>.th,tr>td,tr>th{border-top:0}.cbi-rowstyle-2{background-color:#1e1e1e}.cbi-rowstyle-1{background-color:#252526}.cbi-rowstyle-2 .cbi-button-down,.cbi-rowstyle-2 .cbi-button-up,body:not(.Interfaces) .cbi-rowstyle-2:first-child{background-color:#666!important}.cbi-section>h3:first-child,.panel-title,h3{color:#ccc}h4{background-color:#1e1e1f}.cbi-progressbar{background:#282a2c}.cbi-progressbar div{background-color:var(--dark-primary)!important}.cbi-section-table .cbi-section-table-titles .cbi-section-table-cell{background-color:#1e1e1f}.cbi-button{color:#fff!important;background-color:#483d8b;background-color:var(--dark-primary)}.cbi-section-node{background:0 0}abbr{color:#5e72e4}div>.table>.tbody>.tr:nth-of-type(2n),div>table>tbody>tr:nth-of-type(2n){background-color:#252526}#content_syslog{box-shadow:0 0 .5rem 0 rgba(0,0,0,.35)}#syslog{color:#ccc;background-color:#1e1e1e}#bwsvg,#iwsvg,#iwsvg2{overflow:hidden;box-shadow:0 0 .5rem 0 rgba(0,0,0,.35);background-color:#1e1e1e!important}.tabs{background-color:#252526}.tabs li:hover,.tabs li[class~=active]{cursor:pointer;color:#ccc!important}.tabs li:hover a,.tabs li[class~=active] a{color:#ccc!important}.tabs>li[class~=active]>a{color:#ccc}.tabs>li:hover,.tabs>li[class~=active]{border-bottom:.18751rem solid #483d8b;border-bottom:.18751rem solid var(--dark-primary);color:var(--dark-primary)!important;background-color:#181819}.cbi-tabmenu>li>a,.tabs>li>a{color:#ccc}.cbi-tabmenu>li>a:hover,.tabs>li>a:hover{color:#ccc}.cbi-tabmenu>li{background:#2d2d2d}.cbi-tabmenu li[class~=cbi-tab] a{color:#ccc}.cbi-tabmenu>li:hover{color:#ccc;background:#2d2d2d;border-bottom:.18751rem solid var(--dark-primary)!important}.cbi-tabmenu>li[class~=cbi-tab]{background-color:#181819;border-bottom:.18751rem solid var(--dark-primary)!important}.cbi-tabcontainer>.cbi-value:nth-of-type(2n){background-color:#252526}.cbi-value-title{color:#ccc}input,select{color:#ccc;background-color:transparent!important;border:1px solid #252526;box-shadow:none}input:focus,select:not([multiple=multiple]):focus{border-color:#483d8b!important;border-color:var(--dark-primary)!important;outline:0}.cbi-dropdown:focus,input:not(.cbi-button):focus,select:not([multiple=multiple]):focus{border-color:#5e72e4;border-color:var(--dark-primary)!important}select{background-color:#1e1e1e!important}#cbi-customfeedconf .cbi-map-descr,#cbi-customfeedconf h2,#cbi-distfeedconf .cbi-map-descr,#cbi-distfeedconf h2,#cbi-download h2,#cbi-dropbear .cbi-map-descr,#cbi-dropbear .cbi-map-descr abbr,#cbi-dropbear h2,#cbi-filelist h2,#cbi-rc .cbi-map-descr,#cbi-rc h2{color:#ccc!important}.cbi-value-field>ul>li .ifacebadge{background-color:#3c3c3c}.cbi-section-descr{color:#ccc}.cbi-input-textarea{background-color:#1e1e1e;color:#ccc;border:1px solid #3c3c3c!important}textarea:focus-visible{border:1px solid var(--dark-primary)}.cbi-section-node:nth-of-type(2n),.cbi-section-remove:nth-of-type(2n){background-color:#1e1e1e}.cbi-section[id] .cbi-section-node:nth-of-type(4n+4),.cbi-section[id] .cbi-section-remove:nth-of-type(4n+3){background-color:#1e1e1e}.node-system-packages>.main table tr td:last-child{color:#ccc}.cbi-tooltip{background-color:var(--primary);color:#fff}.ifacebox{background-color:transparent!important;border:1px solid #1e1e1e}.ifacebox-head{color:#ccc;background:#666}.ifacebox-body{background-color:#333}.zonebadge strong{color:#333}.zonebadge>.ifacebadge{background-color:#3c3c3c}div.cbi-value var,td.cbi-value-field var{color:#5e72e4}#diag-rc-output>pre{color:#ccc;background-color:#1e1e1e}.node-services-vssr .block{background-color:#3c3c3c!important;box-shadow:0 0 .5rem 0 rgba(0,0,0,.35)}.node-services-vssr .block h4{color:#ccc!important}.node-services-vssr .status-bar{color:#ccc;box-shadow:0 0 .5rem 0 rgba(0,0,0,.35);background-color:#1e1e1e}.node-services-vssr .cbi-section-table-row{color:#ccc;background-color:#3c3c3c!important;box-shadow:0 0 5px 0 rgba(0,0,0,.35)}.node-services-vssr .cbi-section-table-row.fast{background:#483d8b!important;background:var(--dark-primary)!important;color:#fff}.node-services-vssr .ssr-button{color:#ccc}.node-services-vssr .incon:nth-child(2){border-right:#1e1e1e 1px solid}#xhr_poll_status>.label.success{color:#ccc!important;background-color:#556b2f!important}.notice{background-color:#483d8b!important;background-color:var(--dark-primary)!important}.cbi-section.fade-in .cbi-title>div:last-child span{background:0 0!important;color:#ced4da}.cbi-button-add,.cbi-button-find,.cbi-button-reload,.cbi-button-save,.cbi-input-find,.cbi-input-reload,.cbi-input-save{color:#fff!important;background:#556b2f!important;border-color:#556b2f!important}.cbi-button-reset,.cbi-input-remove{color:#fff!important;background-color:#ff8c00!important;border-color:#ff8c00!important}.cbi-button-action.important,.cbi-button-apply.important,.cbi-button-edit.important,.cbi-button-reload.important,.cbi-page-actions .cbi-button-apply,.cbi-section-actions .cbi-button-edit{border:1px #483d8b solid!important;border:1px var(--dark-primary) solid!important}.btn[value=Dismiss],.cbi-button-neutral[value=Disable],.cbi-button[onclick="handleReset(event)"],.cbi-button[onclick^=iface_reconnect],.cbi-button[value=Disabled],.cbi-button[value=Reset],.cbi-button[value=Terminate]{color:#fff;border:thin solid #ff8c00!important;background-color:#ff8c00!important}fieldset[id^=cbi-apply-]{background-color:#333}#detail-bubble>div{border:1px solid #ccc;background:#252525}.ifacebox-head.active{background-color:var(--dark-primary)!important}header .fill .status span[data-style=active]{color:#ccc!important;background-color:#556b2f!important}#cbi-network .tr:first-child>.td,#cbi-wireless .td,.table[width="100%"]>.tr:first-child>.td,.tr.cbi-section-table-titles>.th,.tr.table-titles>.th,[data-page=admin-network-diagnostics] .tr>.td{background-color:#252526;border-bottom:#000 1px solid!important}.network-status-table .ifacebox-body .ifacebadge{background-color:#252526;border-bottom:0;box-shadow:none}.td>.ifacebadge,td>.ifacebadge{color:#fff;background-color:#483d8b;background-color:var(--dark-primary);border:0}.alert,.alert-message{background-color:#333}.alert-message.warning{background-color:#986400!important}.alert-message.error,.alert.error{background-color:#784f00}.alert h4,.alert-message h4{background-color:#784f00;color:#ffbf00}.alert-message [class=btn]{background-color:#777;color:#ccc}.uci-dialog .cbi-section .uci-change-legend .uci-change-legend-label>ins{border-color:#00ad00;background-color:#688668}.uci-dialog .cbi-section .uci-change-legend .uci-change-legend-label>del{border-color:#c60000;background-color:#896565}.uci-dialog .cbi-section .uci-change-legend .uci-change-legend-label>var{background-color:#333;border-color:#666}.uci-dialog .cbi-section .uci-change-legend .uci-change-legend-label>var ins{background-color:#688668}.uci-dialog .cbi-section .uci-change-legend .uci-change-legend-label>var del{background-color:#896565}.uci-dialog .cbi-section .uci-change-list>var{background-color:#333;border-color:#666}.uci-dialog .cbi-section .uci-change-list>var del{background-color:#896565}.uci-dialog .cbi-section .uci-change-list>var ins{background-color:#688668}.uci-dialog .cbi-section .uci-change-list>ins{border-color:#00ad00;background-color:#688668}.uci-dialog .cbi-section .uci-change-list>del{border-color:#c60000;background-color:#896565}.uci-dialog .cbi-section .uci-change-list+.right .btn{color:#ccc}.uci-dialog .cbi-section .uci-change-list+.right .cbi-button{border:1px solid #3c3c3c!important}.btn.danger,.cbi-button-negative,.cbi-button-neutral[value=Restart],.cbi-button-remove,.cbi-button-reset,.cbi-button[onclick="reboot(this)"],.cbi-button[value=Kill],.cbi-button[value=Stop],.cbi-section-remove>.cbi-button{border:thin solid #ff8c00!important;background-color:#ff8c00!important}#cbi-network>.cbi-section-node,#cbi-wireless>#wifi_assoclist_table,#cbi-wireless>.cbi-section-node,#iptables,.Firewall form,.cbi-section,.cbi-section-error,[data-page=admin-system-opkg] #maincontent>.container,[data-page^=admin-system-admin]:not(.node-main-login) .cbi-map:not(#cbi-dropbear),[data-tab-title]{background:#1e1e1e!important;box-shadow:0 0 .5rem 0 rgba(0,0,0,.35)}div[style="width:100%;height:300px;border:1px solid #000;background:#fff"]{background:0 0!important}[data-page=admin-system-admin-password] .cbi-map .cbi-map-descr,[data-page=admin-system-admin-password] .cbi-map h2,[data-page=admin-system-admin] .cbi-map .cbi-map-descr,[data-page=admin-system-admin] .cbi-map h2{color:#ccc}[data-page=admin-system-flash] .modal label>input[type=checkbox]{vertical-align:text-top;top:auto;border-color:#fff!important}[data-page=admin-system-flash] .modal .btn{white-space:normal!important;background-color:#8fbc8f}[data-page=admin-system-flash] .modal .alert-message{background-color:transparent!important}[data-page=admin-system-flash] .modal .danger{border:thin solid #ff8c00!important;background-color:#ff8c00!important}.cbi-value input[type=password]+.cbi-button-neutral{background-color:#483d8b!important;background-color:var(--dark-primary)!important;border-color:var(--dark-primary)!important}.btn,.cbi-dropdown,button,input,select{border:1px solid #3c3c3c!important}.cbi-dropdown .preview{color:#ccc}.cbi-section-table-row{background-color:#1e1e1e!important}.modal{background-color:#1e1e1e}.cbi-button-positive{color:#fff!important;background-color:#556b2f!important}[data-page=admin-system-flash] legend{color:#ccc}.logout:before{color:#adb5bd!important}.cbi-dropdown[open]{border-color:#483d8b!important;border-color:var(--dark-primary)!important}.cbi-dropdown[open]>ul.dropdown{background:#252526!important;color:#fff!important;box-shadow:none;border:1px solid #3c3c3c!important}.cbi-dropdown[open]>ul.dropdown li{color:#fff;border-bottom:1px solid #3c3c3c!important}.cbi-dropdown[open]>ul.dropdown>li[selected]{background-color:#483d8b!important;background-color:var(--dark-primary)!important;border-bottom:1px solid #3c3c3c!important}.cbi-dropdown[open]>ul.dropdown>li.focus{background:#483d8b;background:var(--dark-primary);outline:0}.ifacebadge{background-color:#333}.cbi-dynlist>.item>span{border:1px solid #3c3c3c!important}.cbi-button-action,.cbi-button-apply,.cbi-button-edit,.cbi-button-reload,.cbi-button[onclick="addKey(event)"],.cbi-button[value$=Apply],.cbi-button[value=Submit],.cbi-button[value=Upload],.cbi-page-actions .cbi-button-apply,.cbi-section-actions .cbi-button-edit{background:#483d8b!important;background:var(--dark-primary)!important;border-color:var(--dark-primary)!important}.btn.primary,.cbi-button-add,.cbi-button-link,.cbi-button-neutral[onclick="handleConfig(event)"],.cbi-button-positive,.cbi-button-save,.cbi-button[value=Enable],.cbi-button[value=Scan],.cbi-button[value^=Back],.cbi-page-actions .cbi-button-apply+.cbi-button-save,.cbi-page-actions .cbi-button-save{background:#483d8b;background:var(--dark-primary)}[data-page=admin-system-opkg] h2{color:#ccc!important}[data-page=admin-system-startup] textarea{color:#ccc;background-color:transparent}[data-page=admin-system-startup] textarea:focus-visible{border:1px solid var(--dark-primary)}[data-page=admin-network-firewall-custom] #view p textarea,[data-page=admin-status-routes] #view p textarea,[data-page=admin-system-crontab] #view p textarea{color:#ccc;background-color:transparent}#view>.spinning{background:#333!important;box-shadow:0 4px 8px rgba(0,0,0,.03)!important}@media screen and (min-width:600px){::-webkit-scrollbar-thumb{background:var(--dark-primary)}::-webkit-scrollbar-thumb:hover{background:var(--dark-primary)}::-webkit-scrollbar-thumb:active{background:var(--dark-primary)}}@media screen and (max-width:480px){.node-status-iptables>.main div>.cbi-map>form{background-color:#1e1e1e;box-shadow:0 0 .5rem 0 rgba(0,0,0,.35)}}[data-page=""] .main-right>#maincontent .Dashboard,[data-page=admin-status-dashboard] .main-right>#maincontent .Dashboard{color:#ccc!important}[data-page=""] .main-right>#maincontent .Dashboard h3,[data-page=admin-status-dashboard] .main-right>#maincontent .Dashboard h3{color:#ccc}[data-page=""] .main-right>#maincontent .Dashboard hr,[data-page=admin-status-dashboard] .main-right>#maincontent .Dashboard hr{border-top:1px solid #fff}[data-page=""] .main-right>#maincontent .Dashboard .dashboard-bg,[data-page=admin-status-dashboard] .main-right>#maincontent .Dashboard .dashboard-bg{background-color:#333}[data-page=""] .main-right>#maincontent .Dashboard img.svgmonochrome,[data-page=admin-status-dashboard] .main-right>#maincontent .Dashboard img.svgmonochrome{filter:invert(90%)}[data-page=""] .main-right>#maincontent .Dashboard tr,[data-page=admin-status-dashboard] .main-right>#maincontent .Dashboard tr{border-top:thin solid #4d4d4d}[data-page=""] .main-right>#maincontent .Dashboard tr:last-child,[data-page=admin-status-dashboard] .main-right>#maincontent .Dashboard tr:last-child{border-bottom:thin solid #4d4d4d}[data-page=admin-system-fileassistant] .fb-container .panel-container{border-bottom-color:#3c3c3c!important}[data-page=admin-system-fileassistant] .fb-container td[class$="-icon"]::before{filter:invert(.7)}[data-page=admin-system-fileassistant] div#list-content table.cbi-section-table tbody tr:first-child td.parent-icon{background:#1e1e1e!important}[data-page^=admin-services-openclash]{--oc-accent:var(--dark-primary);--oc-surface:#1e1e1e;--oc-surface-muted:#252526;--oc-control-bg:#1e1e1e;--oc-border:#3c3c3c;--oc-text:#ccc;--oc-text-muted:#a1a1aa;--oc-neutral:#5b5b5b;--oc-scrollbar:#5b5b5b}[data-page^=admin-services-openclash] img[src$="arrow-clockwise-light.svg"],[data-page^=admin-services-openclash] img[src$="eye-light.svg"],[data-page^=admin-services-openclash] img[src$="wrench-light.svg"]{filter:invert(.9)}[data-page=admin-network-diagnostics] .cbi-section{background:#252526!important}[data-page=admin-network-diagnostics] textarea{background:0 0;border-radius:.25rem;color:#ccc;border:1px solid #3c3c3c!important}[data-page=admin-network-diagnostics] .tr>.td{background-color:#252526!important}[data-page=admin-network-network] .ifacebox-head[style*="--zone-color-rgb: 144, 240, 144"]{background-color:#497e49!important;color:#ccc!important}[data-page=admin-network-network] .ifacebox-head[style*="--zone-color-rgb: 240, 144, 144;"]{background-color:#9c4f4f!important;color:#ccc!important}[data-page=admin-network-network] .ifacebox-head[style*="--zone-color-rgb: 238, 238, 238;"]{background-color:#666!important}[data-page=admin-network-network] #modal_overlay>.modal.cbi-modal>div>p>textarea{border:1px solid #3c3c3c!important;background-color:transparent!important}[data-page=admin-network-network] #modal_overlay div[data-tab=peers] div[data-name="_peers"] .ifacebadge code{color:#fff!important;background-color:transparent!important}[data-page=admin-network-network] #modal_overlay>.modal.cbi-modal>div>p>textarea{color:#ccc!important}[data-page=admin-network-firewall-rules] #cbi-firewall-rule .zonebadge[style*="--zone-color-rgb:240, 144, 144;"]{--zone-color-rgb:156,79,79!important}[data-page=admin-network-firewall-rules] #cbi-firewall-rule .zonebadge[style*="--zone-color-rgb:240, 144, 144;"] strong{color:#ccc!important}[data-page=admin-network-firewall-rules] #cbi-firewall-rule .zonebadge[style*="--zone-color-rgb:238, 238, 238;"]{--zone-color-rgb:112,112,112!important}[data-page=admin-network-firewall-rules] #cbi-firewall-rule .zonebadge[style*="--zone-color-rgb:238, 238, 238;"] em{color:#ccc!important}[data-page=admin-network-firewall-rules] #cbi-firewall-rule>table>.cbi-section-table-row[data-title]::before{background-color:#252526!important}[data-page=admin-network-firewall-rules] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:240, 144, 144;"],[data-page=admin-network-network] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:240, 144, 144;"]{--zone-color-rgb:156,79,79!important;color:#ccc!important}[data-page=admin-network-firewall-rules] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:240, 144, 144;"] strong,[data-page=admin-network-network] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:240, 144, 144;"] strong{color:#ccc!important}[data-page=admin-network-firewall-rules] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:144, 240, 144;"],[data-page=admin-network-network] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:144, 240, 144;"]{--zone-color-rgb:73,126,73!important;color:#ccc!important}[data-page=admin-network-firewall-rules] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:144, 240, 144;"] strong,[data-page=admin-network-network] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:144, 240, 144;"] strong{color:#ccc!important}[data-page=admin-network-firewall-rules] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:238, 238, 238;"],[data-page=admin-network-network] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:238, 238, 238;"]{--zone-color-rgb:112,112,112!important}[data-page=admin-network-firewall-rules] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:238, 238, 238;"] strong,[data-page=admin-network-network] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:238, 238, 238;"] strong{color:#ccc!important}[data-page=admin-network-firewall-rules] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:238, 238, 238;"] strong+span,[data-page=admin-network-network] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:238, 238, 238;"] strong+span{color:#ccc!important}[data-page=admin-system-commands-dashboard] .commandbox,[data-page=admin-system-commands] .commandbox{border-bottom:thin solid #333;background:#252526;box-shadow:inset 0 1px 0 rgba(0,0,0,.2),0 1px 2px rgba(255,255,255,.05)}.btn{background-color:#707070;color:#fff}[data-page=admin-system-admin-repokeys] #key-input{background-color:#1e1e1e;color:#ccc;border:1px solid #3c3c3c!important}[data-page=admin-system-package-manager] #modal_overlay textarea{background-color:#1e1e1e;color:#ccc;border:1px solid #3c3c3c!important}.cbi-dropdown[open]>ul.dropdown>li[selected]{color:#fff} +.modal>pre,.modal>textarea{color: #ccc};