From ca60266e8943c9c8b8dd5ce548b72c68a6425e95 Mon Sep 17 00:00:00 2001 From: weicheng04 Date: Wed, 17 Jun 2026 11:43:49 +0800 Subject: [PATCH 1/3] chore: add .gitignore to exclude local openwrt/ build tree Local builds clone OpenWrt 24.10 into openwrt/ for staging_dir/, build_dir/, bin/ artifacts (~100MB+). Without .gitignore, an accidental 'git add .' would commit all of it. --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d61e59d --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# OpenWrt source tree cloned for local builds (99MB+, contains build artifacts) +openwrt/ From c18c9350f9c31a6dfdae9be6a3cb8b05c3aa86d0 Mon Sep 17 00:00:00 2001 From: weicheng04 Date: Wed, 17 Jun 2026 11:44:07 +0800 Subject: [PATCH 2/3] fix(rs485-module): true byte-level transparent bridge for RS485 <-> MQTT The previous implementation broke transparency in three ways: - Uplink wrapped bytes in a JSON envelope {"data":"..."}, breaking binary protocols like Modbus RTU. - String::from_utf8_lossy() replaced non-UTF-8 bytes with U+FFFD and .trim() stripped whitespace, corrupting raw frames. - Downlink rejected any payload not shaped as {"data":"..."}, preventing binary clients from sending raw bytes. Changes: - main.rs: publish/write_all raw byte slices directly (no JSON wrap); replace serde + serde_json deps with hex (log readability only); fix misleading ConnAck log ("Published" -> "uplink ready on"). - uci-defaults/73_rs485-module: rewrite to populate port1/2/3 per-port sections (was dead code writing flat mqtt.*/serial.* sections that nothing reads). - rs485-module.init: drop stale serial.enabled gate, start one transparent instance per port unless protocol_enabled=1. - Makefile: update description (drop JSON mention). --- feeds/lorawan-gateway/rs485-module/Cargo.toml | 3 +- feeds/lorawan-gateway/rs485-module/Makefile | 6 +- .../files/etc/uci-defaults/73_rs485-module | 72 ++++++------------- .../rs485-module/files/rs485-module.init | 11 ++- .../lorawan-gateway/rs485-module/src/main.rs | 60 +++++----------- 5 files changed, 46 insertions(+), 106 deletions(-) diff --git a/feeds/lorawan-gateway/rs485-module/Cargo.toml b/feeds/lorawan-gateway/rs485-module/Cargo.toml index 3598750..5bb16f2 100644 --- a/feeds/lorawan-gateway/rs485-module/Cargo.toml +++ b/feeds/lorawan-gateway/rs485-module/Cargo.toml @@ -11,6 +11,5 @@ tokio-serial = "5.4" rumqttc = { version = "0.24", features = ["websocket", "use-rustls"] } rustls-pemfile = "2.1" webpki-roots = "0.26" -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" chrono = "0.4" +hex = "0.4" diff --git a/feeds/lorawan-gateway/rs485-module/Makefile b/feeds/lorawan-gateway/rs485-module/Makefile index 97fc73b..37b6dfd 100644 --- a/feeds/lorawan-gateway/rs485-module/Makefile +++ b/feeds/lorawan-gateway/rs485-module/Makefile @@ -18,10 +18,10 @@ define Package/rs485-module endef define Package/rs485-module/description - Bidirectional bridge between RS485 serial port and MQTT broker. + Bidirectional transparent bridge between RS485 serial port and MQTT broker. Written in Rust with rumqttc for async MQTT communication. - Uplink: RS485 data wrapped in JSON {"data":"..."}. - Downlink: MQTT JSON {"data":"..."} converted to raw bytes. + Uplink: RS485 raw bytes published directly to rs485/CH/uplink. + Downlink: payload of rs485/CH/downlink written directly to /dev/RS485-. Reads configuration from UCI (/etc/config/rs485-module). endef diff --git a/feeds/lorawan-gateway/rs485-module/files/etc/uci-defaults/73_rs485-module b/feeds/lorawan-gateway/rs485-module/files/etc/uci-defaults/73_rs485-module index d0fabf7..7856c13 100755 --- a/feeds/lorawan-gateway/rs485-module/files/etc/uci-defaults/73_rs485-module +++ b/feeds/lorawan-gateway/rs485-module/files/etc/uci-defaults/73_rs485-module @@ -1,59 +1,29 @@ #!/bin/sh -# Create rs485-module config if not exists +# Create per-port rs485-module config if the file does not exist. +# Field names here MUST match what main.rs (rs485-module.portN.*) reads. if [ ! -e "/etc/config/rs485-module" ]; then touch /etc/config/rs485-module - # mqtt section - uci set rs485-module.mqtt=mqtt - uci set rs485-module.mqtt.enabled='0' - uci set rs485-module.mqtt.transport='tcp' - uci set rs485-module.mqtt.host='' - uci set rs485-module.mqtt.port='1883' - uci set rs485-module.mqtt.client_id='' - uci set rs485-module.mqtt.keepalive='30' - uci set rs485-module.mqtt.username='' - uci set rs485-module.mqtt.password='' - uci set rs485-module.mqtt.auth_mode='none' - uci set rs485-module.mqtt.uplink_topic='rs485/uplink' - uci set rs485-module.mqtt.downlink_topic='rs485/downlink' - uci set rs485-module.mqtt.clean_session='1' - uci set rs485-module.mqtt.qos='0' - uci set rs485-module.mqtt.reconnect_delay='30' - uci set rs485-module.mqtt.retain_status='0' - - # serial section - uci set rs485-module.serial=serial - uci set rs485-module.serial.enabled='1' - uci set rs485-module.serial.device='RS485-1' - uci set rs485-module.serial.baudrate='9600' - uci set rs485-module.serial.databit='8' - uci set rs485-module.serial.stopbit='1' - uci set rs485-module.serial.checkbit='none' - uci set rs485-module.serial.flowcontrol='none' - uci set rs485-module.serial.timeout='1000' - - # log section - uci set rs485-module.ui=log - uci set rs485-module.ui.auto_refresh='1' - uci set rs485-module.ui.buffer_limit='2000' - uci add_list rs485-module.ui.watch_keywords='join' - uci add_list rs485-module.ui.watch_keywords='error' - - # protocol section - uci set rs485-module.protocol=protocol - uci set rs485-module.protocol.enabled='0' - uci set rs485-module.protocol.type='modbus-rtu' - uci set rs485-module.protocol.device_address='1' - uci set rs485-module.protocol.function_code='03' - uci set rs485-module.protocol.work_mode='once' - uci set rs485-module.protocol.register_address='40001' - uci set rs485-module.protocol.data_length='10' - uci set rs485-module.protocol.poll_interval='3' - uci set rs485-module.protocol.timeout='10' - uci set rs485-module.protocol.enable_crc='1' - uci set rs485-module.protocol.write_value='0' - uci set rs485-module.protocol.standard_mode='1' + for n in 1 2 3; do + sid="port$n" + uci set "rs485-module.${sid}=port" + uci set "rs485-module.${sid}.baudrate='9600'" + uci set "rs485-module.${sid}.databit='8'" + uci set "rs485-module.${sid}.stopbit='1'" + uci set "rs485-module.${sid}.checkbit='none'" + uci set "rs485-module.${sid}.flowcontrol='none'" + uci set "rs485-module.${sid}.timeout='1000'" + uci set "rs485-module.${sid}.mqtt_transport='tcp'" + uci set "rs485-module.${sid}.mqtt_host=''" + uci set "rs485-module.${sid}.mqtt_port='1883'" + uci set "rs485-module.${sid}.mqtt_keepalive='30'" + uci set "rs485-module.${sid}.mqtt_auth_mode='none'" + uci set "rs485-module.${sid}.mqtt_qos='0'" + uci set "rs485-module.${sid}.mqtt_reconnect_delay='5'" + uci set "rs485-module.${sid}.mqtt_uplink_topic='rs485/CH${n}/uplink'" + uci set "rs485-module.${sid}.mqtt_downlink_topic='rs485/CH${n}/downlink'" + done uci commit rs485-module fi diff --git a/feeds/lorawan-gateway/rs485-module/files/rs485-module.init b/feeds/lorawan-gateway/rs485-module/files/rs485-module.init index 7de2774..a3e2380 100755 --- a/feeds/lorawan-gateway/rs485-module/files/rs485-module.init +++ b/feeds/lorawan-gateway/rs485-module/files/rs485-module.init @@ -7,16 +7,13 @@ USE_PROCD=1 PROG=/usr/bin/rs485-module start_service() { - local serial_enabled port_num protocol_enabled - - serial_enabled=$(uci -q get rs485-module.serial.enabled) - [ "$serial_enabled" = "1" ] || return 0 + local port_num protocol_enabled for port_num in 1 2 3; do - protocol_enabled=$(uci -q get rs485-module.port${port_num}.protocol_enabled) + protocol_enabled=$(uci -q get "rs485-module.port${port_num}.protocol_enabled") - # Only start transparent mode for ports where protocol is not enabled - [ "$protocol_enabled" != "1" ] || continue + # Skip transparent mode for ports claimed by a protocol handler (e.g. BACnet MS/TP). + [ "$protocol_enabled" = "1" ] && continue procd_open_instance "port${port_num}" procd_set_param command $PROG "$port_num" diff --git a/feeds/lorawan-gateway/rs485-module/src/main.rs b/feeds/lorawan-gateway/rs485-module/src/main.rs index b8a13e4..1c893bb 100644 --- a/feeds/lorawan-gateway/rs485-module/src/main.rs +++ b/feeds/lorawan-gateway/rs485-module/src/main.rs @@ -2,7 +2,6 @@ use chrono::Local; use rumqttc::{AsyncClient, Event, Incoming, MqttOptions, QoS, Transport}; use rumqttc::tokio_rustls::rustls::ClientConfig as RustlsClientConfig; use rustls_pemfile::{certs, pkcs8_private_keys}; -use serde::{Deserialize, Serialize}; use std::fs::{File, OpenOptions}; use std::io::Write; use std::process::Command; @@ -76,18 +75,6 @@ struct SerialConfig { timeout: Duration, } -// RS485 -> MQTT Message Structure -#[derive(Debug, Serialize)] -struct UplinkMessage { - data: String, -} - -// MQTT -> RS485 Message Structure -#[derive(Debug, Deserialize)] -struct DownlinkMessage { - data: String, -} - // Logger Structure struct Logger { file: StdMutex>, @@ -552,29 +539,24 @@ async fn main() -> Result<(), Box> { logger.log(&format!("Subscribed [MQTT->RS485] to topic: {}", config.mqtt.downlink_topic)); } Err(e) => { - logger.log(&format!("Failed to topic: {}", e)); + logger.log(&format!("Failed to subscribe: {}", e)); } } } - logger.log(&format!("Published [RS485->MQTT] to topic: {}", config.mqtt.uplink_topic)); + logger.log(&format!("MQTT connected, uplink ready on: {}", config.mqtt.uplink_topic)); } // Handle incoming publish messages Incoming::Publish(p) => { - let payload = String::from_utf8_lossy(&p.payload); - logger.log(&format!("MQTT received: {}", payload)); - - if let Ok(msg) = serde_json::from_str::(&payload) { - let data = msg.data.as_bytes(); - match AsyncWriteExt::write_all(&mut serial_port, data).await { - Ok(_) => { - logger.log(&format!("Forwarded to RS485: {}", msg.data)); - } - Err(e) => { - logger.log(&format!("RS485 write failed: {}", e)); - } + let payload_hex = hex::encode_upper(&p.payload); + logger.log(&format!("MQTT received ({} bytes): {}", p.payload.len(), payload_hex)); + + match AsyncWriteExt::write_all(&mut serial_port, &p.payload).await { + Ok(_) => { + logger.log(&format!("Forwarded to RS485: {}", payload_hex)); + } + Err(e) => { + logger.log(&format!("RS485 write failed: {}", e)); } - } else { - logger.log(&format!("Invalid message format, expected {{\"data\":\"...\"}}, got: {}", payload)); } } // Handle subscription acknowledgment @@ -627,24 +609,16 @@ async fn main() -> Result<(), Box> { } => { match serial_result { Ok((n, buffer)) if n > 0 => { - let data_str = String::from_utf8_lossy(&buffer[..n]).trim().to_string(); - logger.log(&format!("RS485 received ({} bytes): {}", n, data_str)); + let payload_hex = hex::encode_upper(&buffer[..n]); + logger.log(&format!("RS485 received ({} bytes): {}", n, payload_hex)); if let Some(ref client) = mqtt_client { - let uplink_msg = UplinkMessage { data: data_str.clone() }; - match serde_json::to_string(&uplink_msg) { - Ok(json) => { - match client.publish(&config.mqtt.uplink_topic, config.mqtt.qos_level, false, json.as_bytes()).await { - Ok(_) => { - logger.log(&format!("Published to MQTT: {}", json)); - } - Err(e) => { - logger.log(&format!("MQTT publish failed: {}", e)); - } - } + match client.publish(&config.mqtt.uplink_topic, config.mqtt.qos_level, false, &buffer[..n]).await { + Ok(_) => { + logger.log(&format!("Published to MQTT: {}", payload_hex)); } Err(e) => { - logger.log(&format!("JSON serialization failed: {}", e)); + logger.log(&format!("MQTT publish failed: {}", e)); } } } From 319933c7338b7eb47877b091e70c8501bb50c916 Mon Sep 17 00:00:00 2001 From: weicheng04 Date: Wed, 17 Jun 2026 11:44:48 +0800 Subject: [PATCH 3/3] fix(luci-theme-sensecap): proper dark mode for sensecap custom views SenseCAP app JS injected hardcoded inline colors (background:#fff, color:#333, border:#ccc, etc.) in fixed-height log viewers, chart containers, and a basicstation upload dropzone. Inline styles have priority 1000 and could not be overridden by dark.css selectors, leaving "white holes" when the browser switched to dark mode. Changes: - Add 13 --sensecap-* CSS variables (light defaults + dark overrides) to cascade.less/.css and dark.less/.css, covering: log viewer bg/fg/border, chart bg/border, muted bg, dropzone border/hover-bg, muted/emphasis fg, divider, neutral button bg/hover. - Replace hardcoded colors in 7 JS files with var() references: rs485/log.js, lora/log.js, lora/status/include/19_lora.js, lora/lora-platform/basicstation.js, ups/log.js, ups/ups.js, system/ota.js. - basicstation .sfu-* stylesheet: brand green #8FC320 -> var(--primary). Note: cascade.css / dark.css are less compilation outputs (Easy LESS VS Code plugin); both .less source and .css artifact updated in lockstep since the OpenWrt build does not invoke lessc. --- .../luci-static/resources/view/lora/log.js | 2 +- .../view/lora/lora-platform/basicstation.js | 2 +- .../resources/view/status/include/19_lora.js | 2 +- .../luci-static/resources/view/system/ota.js | 2 +- .../luci-static/resources/view/rs485/log.js | 2 +- .../luci-static/resources/view/ups/log.js | 2 +- .../luci-static/resources/view/ups/ups.js | 2 +- .../htdocs/luci-static/argon/css/cascade.css | 15 +++++++++++++++ .../htdocs/luci-static/argon/css/dark.css | 2 +- .../luci-theme-sensecap/less/cascade.less | 15 +++++++++++++++ .../luci-theme-sensecap/less/dark.less | 17 +++++++++++++++++ 11 files changed, 55 insertions(+), 8 deletions(-) diff --git a/feeds/luci-lorawan-gateway/luci-app-lora/htdocs/luci-static/resources/view/lora/log.js b/feeds/luci-lorawan-gateway/luci-app-lora/htdocs/luci-static/resources/view/lora/log.js index 06c56c2..d59718f 100644 --- a/feeds/luci-lorawan-gateway/luci-app-lora/htdocs/luci-static/resources/view/lora/log.js +++ b/feeds/luci-lorawan-gateway/luci-app-lora/htdocs/luci-static/resources/view/lora/log.js @@ -46,7 +46,7 @@ return view.extend({ logView.renderWidget = function(section_id, option_id, cfgvalue) { return E('div', { 'id': 'log_view', - 'style': 'width:100%; height:600px; overflow:auto; border:1px solid #ccc; padding:5px; font-family:monospace; white-space:pre; background:#fff; color:#333; resize:vertical;' + 'style': 'width:100%; height:600px; overflow:auto; border:1px solid var(--sensecap-log-border); padding:5px; font-family:monospace; white-space:pre; background:var(--sensecap-log-bg); color:var(--sensecap-log-fg); resize:vertical;' }, _('Loading logs...')); }; diff --git a/feeds/luci-lorawan-gateway/luci-app-lora/htdocs/luci-static/resources/view/lora/lora-platform/basicstation.js b/feeds/luci-lorawan-gateway/luci-app-lora/htdocs/luci-static/resources/view/lora/lora-platform/basicstation.js index c4d22d6..71e518a 100644 --- a/feeds/luci-lorawan-gateway/luci-app-lora/htdocs/luci-static/resources/view/lora/lora-platform/basicstation.js +++ b/feeds/luci-lorawan-gateway/luci-app-lora/htdocs/luci-static/resources/view/lora/lora-platform/basicstation.js @@ -206,7 +206,7 @@ return view.extend({ if (!document.getElementById('basicstation-sfu-style')) { var style = document.createElement('style'); style.id = 'basicstation-sfu-style'; - style.textContent = '.sfu-container{border-radius:10px;padding:16px}.sfu-dropzone{border:2px dashed #cbd5e0;border-radius:6px;padding:16px;text-align:center;cursor:pointer;transition:border-color 0.2s,background-color 0.2s}.sfu-dropzone:hover{border-color:#8FC320;background:#f3f8e8}.sfu-dropzone.has-file{border-style:solid;border-color:#8FC320}.sfu-text{color:#6b7280;font-size:15px}.sfu-dropzone.has-file .sfu-text{color:#2d3748;font-weight:500}.sfu-buttons{display:flex;justify-content:flex-end;gap:10px;margin-top:14px;padding-top:14px;border-top:1px solid #e2e8f0}.sfu-btn-remove,.sfu-btn-upload{color:#fff!important;background:#8898aa;border:none!important;padding:6px 20px;border-radius:4px;font-size:14px;cursor:pointer}.sfu-btn-upload:hover,.sfu-btn-remove:hover{background:#6c7a8d}'; + style.textContent = '.sfu-container{border-radius:10px;padding:16px}.sfu-dropzone{border:2px dashed var(--sensecap-dropzone-border);border-radius:6px;padding:16px;text-align:center;cursor:pointer;transition:border-color 0.2s,background-color 0.2s}.sfu-dropzone:hover{border-color:var(--primary);background:var(--sensecap-dropzone-hover-bg)}.sfu-dropzone.has-file{border-style:solid;border-color:var(--primary)}.sfu-text{color:var(--sensecap-muted-fg);font-size:15px}.sfu-dropzone.has-file .sfu-text{color:var(--sensecap-emphasis-fg);font-weight:500}.sfu-buttons{display:flex;justify-content:flex-end;gap:10px;margin-top:14px;padding-top:14px;border-top:1px solid var(--sensecap-divider)}.sfu-btn-remove,.sfu-btn-upload{color:#fff!important;background:var(--sensecap-neutral-btn-bg);border:none!important;padding:6px 20px;border-radius:4px;font-size:14px;cursor:pointer}.sfu-btn-upload:hover,.sfu-btn-remove:hover{background:var(--sensecap-neutral-btn-bg-hover)}'; document.head.appendChild(style); } diff --git a/feeds/luci-lorawan-gateway/luci-app-lora/htdocs/luci-static/resources/view/status/include/19_lora.js b/feeds/luci-lorawan-gateway/luci-app-lora/htdocs/luci-static/resources/view/status/include/19_lora.js index 21e82d0..06f5afa 100644 --- a/feeds/luci-lorawan-gateway/luci-app-lora/htdocs/luci-static/resources/view/status/include/19_lora.js +++ b/feeds/luci-lorawan-gateway/luci-app-lora/htdocs/luci-static/resources/view/status/include/19_lora.js @@ -125,7 +125,7 @@ return baseclass.extend({ rv.appendChild(E('div', { 'class': 'cbi-section' }, [ E('h3', _('LoRa Packets')), - E('div', { 'style': 'background:#fff; margin: 20px 0; border:1px solid #ddd;' }, [svg2Div]) + E('div', { 'style': 'background:var(--sensecap-chart-bg); margin: 20px 0; border:1px solid var(--sensecap-chart-border);' }, [svg2Div]) ])); return rv; diff --git a/feeds/luci-lorawan-gateway/luci-app-ota/root/www/luci-static/resources/view/system/ota.js b/feeds/luci-lorawan-gateway/luci-app-ota/root/www/luci-static/resources/view/system/ota.js index 7d810bd..6f05ea3 100644 --- a/feeds/luci-lorawan-gateway/luci-app-ota/root/www/luci-static/resources/view/system/ota.js +++ b/feeds/luci-lorawan-gateway/luci-app-ota/root/www/luci-static/resources/view/system/ota.js @@ -210,7 +210,7 @@ return view.extend({ var self = this; ui.showModal(_('OTA Firmware Upgrade'), [ E('div', {}, 'Ready to download firmware from:'), - E('pre', { 'style': 'margin: 10px 0; padding: 5px; background: #f5f5f5; overflow-x: auto;' }, displayUrl), + E('pre', { 'style': 'margin: 10px 0; padding: 5px; background: var(--sensecap-muted-bg); color: var(--sensecap-log-fg); overflow-x: auto;' }, displayUrl), E('div', { 'class': 'right' }, [ E('button', { 'class': 'btn', diff --git a/feeds/luci-lorawan-gateway/luci-app-rs485/htdocs/luci-static/resources/view/rs485/log.js b/feeds/luci-lorawan-gateway/luci-app-rs485/htdocs/luci-static/resources/view/rs485/log.js index 1257a9d..4d56780 100644 --- a/feeds/luci-lorawan-gateway/luci-app-rs485/htdocs/luci-static/resources/view/rs485/log.js +++ b/feeds/luci-lorawan-gateway/luci-app-rs485/htdocs/luci-static/resources/view/rs485/log.js @@ -46,7 +46,7 @@ return view.extend({ logView.renderWidget = function(section_id, option_id, cfgvalue) { return E('div', { 'id': 'log_view', - 'style': 'width:100%; height:600px; overflow:auto; border:1px solid #ccc; padding:5px; font-family:monospace; white-space:pre; background:#fff; color:#333; resize:vertical;' + 'style': 'width:100%; height:600px; overflow:auto; border:1px solid var(--sensecap-log-border); padding:5px; font-family:monospace; white-space:pre; background:var(--sensecap-log-bg); color:var(--sensecap-log-fg); resize:vertical;' }, _('Loading logs...')); }; diff --git a/feeds/luci-lorawan-gateway/luci-app-ups/htdocs/luci-static/resources/view/ups/log.js b/feeds/luci-lorawan-gateway/luci-app-ups/htdocs/luci-static/resources/view/ups/log.js index f079fc4..14d30a6 100644 --- a/feeds/luci-lorawan-gateway/luci-app-ups/htdocs/luci-static/resources/view/ups/log.js +++ b/feeds/luci-lorawan-gateway/luci-app-ups/htdocs/luci-static/resources/view/ups/log.js @@ -46,7 +46,7 @@ return view.extend({ logView.renderWidget = function(section_id, option_id, cfgvalue) { return E('div', { 'id': 'log_view', - 'style': 'width:100%; height:600px; overflow:auto; border:1px solid #ccc; padding:5px; font-family:monospace; white-space:pre; background:#fff; color:#333; resize:vertical;' + 'style': 'width:100%; height:600px; overflow:auto; border:1px solid var(--sensecap-log-border); padding:5px; font-family:monospace; white-space:pre; background:var(--sensecap-log-bg); color:var(--sensecap-log-fg); resize:vertical;' }, _('Loading logs...')); }; diff --git a/feeds/luci-lorawan-gateway/luci-app-ups/htdocs/luci-static/resources/view/ups/ups.js b/feeds/luci-lorawan-gateway/luci-app-ups/htdocs/luci-static/resources/view/ups/ups.js index fb5a2e0..932db53 100644 --- a/feeds/luci-lorawan-gateway/luci-app-ups/htdocs/luci-static/resources/view/ups/ups.js +++ b/feeds/luci-lorawan-gateway/luci-app-ups/htdocs/luci-static/resources/view/ups/ups.js @@ -39,7 +39,7 @@ return view.extend({ logView.renderWidget = function(section_id, option_id, cfgvalue) { return E('div', { 'id': 'ups_log_view', - 'style': 'width:100%; height:400px; overflow:auto; border:1px solid #ccc; padding:10px; font-family:monospace; white-space:pre; background:#f5f5f5; color:#333; resize:vertical;' + 'style': 'width:100%; height:400px; overflow:auto; border:1px solid var(--sensecap-log-border); padding:10px; font-family:monospace; white-space:pre; background:var(--sensecap-muted-bg); color:var(--sensecap-log-fg); resize:vertical;' }, _('Loading logs...')); }; diff --git a/feeds/luci-lorawan-gateway/luci-theme-sensecap/htdocs/luci-static/argon/css/cascade.css b/feeds/luci-lorawan-gateway/luci-theme-sensecap/htdocs/luci-static/argon/css/cascade.css index 3e1116c..95d6cab 100644 --- a/feeds/luci-lorawan-gateway/luci-theme-sensecap/htdocs/luci-static/argon/css/cascade.css +++ b/feeds/luci-lorawan-gateway/luci-theme-sensecap/htdocs/luci-static/argon/css/cascade.css @@ -54,6 +54,21 @@ --blur-opacity-dark: 0.5; --font-family-sans-serif: "Google Sans", "Microsoft Yahei", "WenQuanYi Micro Hei", "sans-serif", "Helvetica Neue", "Helvetica", "Hiragino Sans GB"; --dropdown-arrow-icon: url("data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBmaWxsPSJjdXJyZW50Q29sb3IiIGQ9Ik01LjI5MyA5LjI5M2ExIDEgMCAwIDEgMS40MTQgMEwxMiAxNC41ODZsNS4yOTMtNS4yOTNhMSAxIDAgMSAxIDEuNDE0IDEuNDE0bC02IDZhMSAxIDAgMCAxLTEuNDE0IDBsLTYtNmExIDEgMCAwIDEgMC0xLjQxNCIvPjwvc3ZnPg=="); + + /* SenseCAP tokens consumed by luci-app-* inline styles — overridden in dark.css */ + --sensecap-log-bg: #ffffff; + --sensecap-log-fg: #333333; + --sensecap-log-border: #cccccc; + --sensecap-chart-bg: #ffffff; + --sensecap-chart-border: #dddddd; + --sensecap-muted-bg: #f5f5f5; + --sensecap-dropzone-border: #cbd5e0; + --sensecap-dropzone-hover-bg: #f3f8e8; + --sensecap-muted-fg: #6b7280; + --sensecap-emphasis-fg: #2d3748; + --sensecap-divider: #e2e8f0; + --sensecap-neutral-btn-bg: #8898aa; + --sensecap-neutral-btn-bg-hover: #6c7a8d; } /* * Include base and custom css diff --git a/feeds/luci-lorawan-gateway/luci-theme-sensecap/htdocs/luci-static/argon/css/dark.css b/feeds/luci-lorawan-gateway/luci-theme-sensecap/htdocs/luci-static/argon/css/dark.css index fc36987..e9bb795 100644 --- a/feeds/luci-lorawan-gateway/luci-theme-sensecap/htdocs/luci-static/argon/css/dark.css +++ b/feeds/luci-lorawan-gateway/luci-theme-sensecap/htdocs/luci-static/argon/css/dark.css @@ -1 +1 @@ -body{background:#1e1e1e;color:#cccccc}.spinning::before{filter:invert(1)}.login-page .login-container .login-form{background-color:#1e1e1e;-webkit-backdrop-filter:blur(var(--blur-radius-dark)) brightness(0);backdrop-filter:blur(var(--blur-radius-dark)) brightness(0);background-color:rgba(0, 0, 0, var(--blur-opacity-dark))}.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:hover,.login-page .login-container .login-form .form-login .cbi-button-apply:focus{opacity:.9}header::after{background-color:#1e1e1e !important}.main .main-left{background-color:#333333 !important;box-shadow:0 0 .5rem 0 rgba(0,0,0,0.15)}.main .main-left .sidenav-header .brand{color:#cccccc}.main .main-left .nav .slide .slide-menu .active a{color:#cccccc}.main .main-left .nav .slide .slide-menu .active a::after{background-color:#cccccc !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:#cccccc}.main .main-left .nav .slide .slide-menu li a:hover{background:none !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:#ffffff !important}.main .main-left .nav .slide .menu.active a::after{background-color:#ffffff !important}.main .main-left .nav li a{color:#cccccc !important}.main .main-left .nav li a:hover{background-color:#483d8b !important;background-color:var(--dark-primary) !important;color:#ffffff !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:#333333}h3{color:#ccc;border-bottom:0;background:#333333}h4{color:#8C6900}abbr{color:var(--dark-primary) !important}a:link,a:visited,a:active{color:#a5b2ff}input:-webkit-autofill{background-color:#3c3c3c !important}#channel_graph{background-color:transparent !important}.cbi-value-field .cbi-input-apply,.cbi-button-apply,.cbi-button-edit{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:none;box-shadow:0 0 .5rem 0 rgba(0,0,0,0.35)}.panel-title{color:#ccc;background-color:#333333}div>table>tbody>tr:nth-of-type(2n),div>.table>.tr:nth-of-type(2n){background-color:#252526}table>tbody>tr>td,table>tfoot>tr>td,table>thead>tr>td{color:#cccccc}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}#swaptotal>div>div,#swapfree>div>div,#memfree>div>div,#membuff>div>div,#conns>div>div,#memtotal>div>div{background-color:var(--dark-primary) !important}#swaptotal>div>div>div>small,#swapfree>div>div>div>small,#memfree>div>div>div>small,#membuff>div>div>div>small,#conns>div>div>div>small,#memtotal>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 #999999 !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:black 1px solid !important}.tr[data-title]::before,.tr.cbi-section-table-titles.named::before{background-color:#252526}tr>td,tr>th,.tr>.td,.tr>.th,.cbi-section-table-row::before,#cbi-wireless>#wifi_assoclist_table>.tr:nth-child(2){border-top:0}.cbi-rowstyle-2{background-color:#1e1e1e}.cbi-rowstyle-1{background-color:#252526}.cbi-rowstyle-2 .cbi-button-up,.cbi-rowstyle-2 .cbi-button-down,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:#ffffff !important;background-color:#483d8b;background-color:var(--dark-primary)}.cbi-section-node{background:none}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,0.35)}#syslog{color:#ccc;background-color:#1e1e1e}#iwsvg,#iwsvg2,#bwsvg{overflow:hidden;box-shadow:0 0 .5rem 0 rgba(0,0,0,0.35);background-color:#1e1e1e !important}.tabs{background-color:#252526}.tabs li[class~="active"],.tabs li:hover{cursor:pointer;color:#ccc !important}.tabs li[class~="active"] a,.tabs li:hover a{color:#ccc !important}.tabs>li[class~="active"]>a{color:#ccc}.tabs>li[class~="active"],.tabs>li:hover{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}select,input{color:#ccc;background-color:transparent !important;border:1px solid #252526;box-shadow:none}select:not([multiple="multiple"]):focus,input:focus{border-color:#483d8b !important;border-color:var(--dark-primary) !important;outline:0}select:not([multiple="multiple"]):focus,input:not(.cbi-button):focus,.cbi-dropdown:focus{border-color:#5e72e4;border-color:var(--dark-primary) !important}select{background-color:#1e1e1e !important}#cbi-dropbear h2,#cbi-dropbear .cbi-map-descr,#cbi-dropbear .cbi-map-descr abbr,#cbi-rc h2,#cbi-rc .cbi-map-descr,#cbi-distfeedconf h2,#cbi-distfeedconf .cbi-map-descr,#cbi-customfeedconf h2,#cbi-customfeedconf .cbi-map-descr,#cbi-download h2,#cbi-filelist 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-remove:nth-of-type(2n),.cbi-section-node:nth-of-type(2n){background-color:#1e1e1e}.cbi-section[id] .cbi-section-remove:nth-of-type(4n+3),.cbi-section[id] .cbi-section-node:nth-of-type(4n+4){background-color:#1e1e1e}.node-system-packages>.main table tr td:nth-last-child(1){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,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,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,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:darkolivegreen !important}.notice{background-color:#483d8b !important;background-color:var(--dark-primary) !important}.cbi-section.fade-in .cbi-title>div:last-child span{background:none!important;color:#ced4da}.cbi-input-find,.cbi-input-save,.cbi-button-add,.cbi-button-save,.cbi-button-find,.cbi-input-reload,.cbi-button-reload{color:#fff !important;background:darkolivegreen !important;border-color:darkolivegreen !important}.cbi-button-reset,.cbi-input-remove{color:#fff !important;background-color:darkorange !important;border-color:darkorange !important}.cbi-page-actions .cbi-button-apply,.cbi-section-actions .cbi-button-edit,.cbi-button-edit.important,.cbi-button-apply.important,.cbi-button-reload.important,.cbi-button-action.important{border:1px #483d8b solid !important;border:1px var(--dark-primary) solid !important}.btn[value="Dismiss"],.cbi-button[value="Terminate"],.cbi-button[value="Reset"],.cbi-button[value="Disabled"],.cbi-button[onclick^="iface_reconnect"],.cbi-button[onclick="handleReset(event)"],.cbi-button-neutral[value="Disable"]{color:#fff;border:thin solid darkorange !important;background-color:darkorange !important}fieldset[id^="cbi-apply-"]{background-color:#333333}#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:darkolivegreen !important}#cbi-wireless .td,#cbi-network .tr:first-child>.td,.table[width="100%"]>.tr:first-child>.td,[data-page="admin-network-diagnostics"] .tr>.td,.tr.table-titles>.th,.tr.cbi-section-table-titles>.th{background-color:#252526;border-bottom:black 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.error,.alert-message.error{background-color:#784f00}.alert h4,.alert-message h4{background-color:#784f00;color:#ffbf00}.alert-message [class="btn"]{background-color:#777777;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-section-remove>.cbi-button,.cbi-button-remove,.cbi-button-reset,.cbi-button-negative,.cbi-button[value="Stop"],.cbi-button[value="Kill"],.cbi-button[onclick="reboot(this)"],.cbi-button-neutral[value="Restart"]{border:thin solid darkorange !important;background-color:darkorange !important}.cbi-section,.cbi-section-error,#iptables,.Firewall form,#cbi-network>.cbi-section-node,#cbi-wireless>.cbi-section-node,#cbi-wireless>#wifi_assoclist_table,[data-tab-title],[data-page^="admin-system-admin"]:not(.node-main-login) .cbi-map:not(#cbi-dropbear),[data-page="admin-system-opkg"] #maincontent>.container{background:#1e1e1e !important;box-shadow:0 0 .5rem 0 rgba(0,0,0,0.35)}div[style="width:100%;height:300px;border:1px solid #000;background:#fff"]{background:transparent !important}[data-page="admin-system-admin"] .cbi-map h2,[data-page="admin-system-admin-password"] .cbi-map h2,[data-page="admin-system-admin"] .cbi-map .cbi-map-descr,[data-page="admin-system-admin-password"] .cbi-map .cbi-map-descr{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:darkseagreen}[data-page="admin-system-flash"] .modal .alert-message{background-color:transparent !important}[data-page="admin-system-flash"] .modal .danger{border:thin solid darkorange !important;background-color:darkorange !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,button,select,input,.cbi-dropdown{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:darkolivegreen !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:#ffffff !important;box-shadow:none;border:1px solid #3c3c3c !important}.cbi-dropdown[open]>ul.dropdown li{color:#ffffff;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:none}.ifacebadge{background-color:#333333}.cbi-dynlist>.item>span{border:1px solid #3c3c3c !important}.cbi-page-actions .cbi-button-apply,.cbi-section-actions .cbi-button-edit,.cbi-button-edit,.cbi-button-apply,.cbi-button-reload,.cbi-button-action,.cbi-button[value="Submit"],.cbi-button[value="Upload"],.cbi-button[value$="Apply"],.cbi-button[onclick="addKey(event)"]{background:#483d8b !important;background:var(--dark-primary) !important;border-color:var(--dark-primary) !important}.btn.primary,.cbi-page-actions .cbi-button-save,.cbi-page-actions .cbi-button-apply+.cbi-button-save,.cbi-button-add,.cbi-button-save,.cbi-button-positive,.cbi-button-link,.cbi-button[value="Enable"],.cbi-button[value="Scan"],.cbi-button[value^="Back"],.cbi-button-neutral[onclick="handleConfig(event)"]{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:#333333 !important;box-shadow:0 4px 8px rgba(0,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,0.35)}}[data-page=""] .main-right>#maincontent .Dashboard,[data-page="admin-dashboard"] .main-right>#maincontent .Dashboard{color:#ccc !important}[data-page=""] .main-right>#maincontent .Dashboard h3,[data-page="admin-dashboard"] .main-right>#maincontent .Dashboard h3{color:#ccc}[data-page=""] .main-right>#maincontent .Dashboard hr,[data-page="admin-dashboard"] .main-right>#maincontent .Dashboard hr{border-top:1px solid #fff}[data-page=""] .main-right>#maincontent .Dashboard .dashboard-bg,[data-page="admin-dashboard"] .main-right>#maincontent .Dashboard .dashboard-bg{background-color:#333333}[data-page=""] .main-right>#maincontent .Dashboard img.svgmonochrome,[data-page="admin-dashboard"] .main-right>#maincontent .Dashboard img.svgmonochrome{filter:invert(90%)}[data-page=""] .main-right>#maincontent .Dashboard tr,[data-page="admin-dashboard"] .main-right>#maincontent .Dashboard tr{border-top:thin solid #4d4d4d}[data-page=""] .main-right>#maincontent .Dashboard tr:last-child,[data-page="admin-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:nth-child(1) td.parent-icon{background:#1e1e1e !important}[data-page^="admin-services-openclash"] .oc{--bg-light:#1e1e1e !important;--bg-gray:#1e1e1e !important}[data-page^="admin-services-openclash"] .oc .developer-container{background:transparent !important}[data-page^="admin-services-openclash"] .config-upload-content{background:#1e1e1e !important}[data-page^="admin-services-openclash"] .cbi-tabmenu::-webkit-scrollbar-thumb{background-color:#5b5b5b}[data-page^="admin-services-openclash"] .cbi-tabmenu::-webkit-scrollbar-track{background-color:rgba(60,60,60,0.75)}[data-page^="admin-services-openclash"] #tab{border-color:#3c3c3c}[data-page^="admin-services-openclash"] #diag-rc-output>pre,[data-page^="admin-services-openclash"] #dns-rc-output>pre{color:#ccc;border:1px solid #3c3c3c !important;background-color:#1e1e1e}[data-page^="admin-services-openclash"] img[src$="arrow-clockwise-light.svg"],[data-page^="admin-services-openclash"] img[src$="wrench-light.svg"],[data-page^="admin-services-openclash"] img[src$="eye-light.svg"]{filter:invert(.9)}[data-page="admin-network-diagnostics"] .cbi-section{background:#252526 !important}[data-page="admin-network-diagnostics"] textarea{background:transparent;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-network"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:240, 144, 144;"],[data-page="admin-network-firewall-rules"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:240, 144, 144;"]{--zone-color-rgb:156, 79, 79 !important;color:#ccc !important}[data-page="admin-network-network"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:240, 144, 144;"] strong,[data-page="admin-network-firewall-rules"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:240, 144, 144;"] strong{color:#ccc !important}[data-page="admin-network-network"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:144, 240, 144;"],[data-page="admin-network-firewall-rules"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:144, 240, 144;"]{--zone-color-rgb:73, 126, 73 !important;color:#ccc !important}[data-page="admin-network-network"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:144, 240, 144;"] strong,[data-page="admin-network-firewall-rules"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:144, 240, 144;"] strong{color:#ccc !important}[data-page="admin-network-network"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:238, 238, 238;"],[data-page="admin-network-firewall-rules"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:238, 238, 238;"]{--zone-color-rgb:112, 112, 112 !important}[data-page="admin-network-network"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:238, 238, 238;"] strong,[data-page="admin-network-firewall-rules"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:238, 238, 238;"] strong{color:#ccc !important}[data-page="admin-network-network"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:238, 238, 238;"] strong+span,[data-page="admin-network-firewall-rules"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:238, 238, 238;"] strong+span{color:#ccc !important}[data-page="admin-system-commands"] .commandbox,[data-page="admin-system-commands-dashboard"] .commandbox{border-bottom:thin solid #333;background:#252526;box-shadow:inset 0 1px 0 rgba(0,0,0,0.2),0 1px 2px rgba(255,255,255,0.05)}.btn{background-color:#707070;color:#fff} \ No newline at end of file +:root{--sensecap-log-bg:#1e1e1e;--sensecap-log-fg:#cccccc;--sensecap-log-border:#3c3c3c;--sensecap-chart-bg:#1e1e1e;--sensecap-chart-border:#252526;--sensecap-muted-bg:#252526;--sensecap-dropzone-border:#3c3c3c;--sensecap-dropzone-hover-bg:#2a2e1a;--sensecap-muted-fg:#adb5bd;--sensecap-emphasis-fg:#ced4da;--sensecap-divider:#3c3c3c;--sensecap-neutral-btn-bg:#4a5568;--sensecap-neutral-btn-bg-hover:#5a6578}body{background:#1e1e1e;color:#cccccc}.spinning::before{filter:invert(1)}.login-page .login-container .login-form{background-color:#1e1e1e;-webkit-backdrop-filter:blur(var(--blur-radius-dark)) brightness(0);backdrop-filter:blur(var(--blur-radius-dark)) brightness(0);background-color:rgba(0, 0, 0, var(--blur-opacity-dark))}.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:hover,.login-page .login-container .login-form .form-login .cbi-button-apply:focus{opacity:.9}header::after{background-color:#1e1e1e !important}.main .main-left{background-color:#333333 !important;box-shadow:0 0 .5rem 0 rgba(0,0,0,0.15)}.main .main-left .sidenav-header .brand{color:#cccccc}.main .main-left .nav .slide .slide-menu .active a{color:#cccccc}.main .main-left .nav .slide .slide-menu .active a::after{background-color:#cccccc !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:#cccccc}.main .main-left .nav .slide .slide-menu li a:hover{background:none !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:#ffffff !important}.main .main-left .nav .slide .menu.active a::after{background-color:#ffffff !important}.main .main-left .nav li a{color:#cccccc !important}.main .main-left .nav li a:hover{background-color:#483d8b !important;background-color:var(--dark-primary) !important;color:#ffffff !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:#333333}h3{color:#ccc;border-bottom:0;background:#333333}h4{color:#8C6900}abbr{color:var(--dark-primary) !important}a:link,a:visited,a:active{color:#a5b2ff}input:-webkit-autofill{background-color:#3c3c3c !important}#channel_graph{background-color:transparent !important}.cbi-value-field .cbi-input-apply,.cbi-button-apply,.cbi-button-edit{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:none;box-shadow:0 0 .5rem 0 rgba(0,0,0,0.35)}.panel-title{color:#ccc;background-color:#333333}div>table>tbody>tr:nth-of-type(2n),div>.table>.tr:nth-of-type(2n){background-color:#252526}table>tbody>tr>td,table>tfoot>tr>td,table>thead>tr>td{color:#cccccc}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}#swaptotal>div>div,#swapfree>div>div,#memfree>div>div,#membuff>div>div,#conns>div>div,#memtotal>div>div{background-color:var(--dark-primary) !important}#swaptotal>div>div>div>small,#swapfree>div>div>div>small,#memfree>div>div>div>small,#membuff>div>div>div>small,#conns>div>div>div>small,#memtotal>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 #999999 !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:black 1px solid !important}.tr[data-title]::before,.tr.cbi-section-table-titles.named::before{background-color:#252526}tr>td,tr>th,.tr>.td,.tr>.th,.cbi-section-table-row::before,#cbi-wireless>#wifi_assoclist_table>.tr:nth-child(2){border-top:0}.cbi-rowstyle-2{background-color:#1e1e1e}.cbi-rowstyle-1{background-color:#252526}.cbi-rowstyle-2 .cbi-button-up,.cbi-rowstyle-2 .cbi-button-down,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:#ffffff !important;background-color:#483d8b;background-color:var(--dark-primary)}.cbi-section-node{background:none}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,0.35)}#syslog{color:#ccc;background-color:#1e1e1e}#iwsvg,#iwsvg2,#bwsvg{overflow:hidden;box-shadow:0 0 .5rem 0 rgba(0,0,0,0.35);background-color:#1e1e1e !important}.tabs{background-color:#252526}.tabs li[class~="active"],.tabs li:hover{cursor:pointer;color:#ccc !important}.tabs li[class~="active"] a,.tabs li:hover a{color:#ccc !important}.tabs>li[class~="active"]>a{color:#ccc}.tabs>li[class~="active"],.tabs>li:hover{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}select,input{color:#ccc;background-color:transparent !important;border:1px solid #252526;box-shadow:none}select:not([multiple="multiple"]):focus,input:focus{border-color:#483d8b !important;border-color:var(--dark-primary) !important;outline:0}select:not([multiple="multiple"]):focus,input:not(.cbi-button):focus,.cbi-dropdown:focus{border-color:#5e72e4;border-color:var(--dark-primary) !important}select{background-color:#1e1e1e !important}#cbi-dropbear h2,#cbi-dropbear .cbi-map-descr,#cbi-dropbear .cbi-map-descr abbr,#cbi-rc h2,#cbi-rc .cbi-map-descr,#cbi-distfeedconf h2,#cbi-distfeedconf .cbi-map-descr,#cbi-customfeedconf h2,#cbi-customfeedconf .cbi-map-descr,#cbi-download h2,#cbi-filelist 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-remove:nth-of-type(2n),.cbi-section-node:nth-of-type(2n){background-color:#1e1e1e}.cbi-section[id] .cbi-section-remove:nth-of-type(4n+3),.cbi-section[id] .cbi-section-node:nth-of-type(4n+4){background-color:#1e1e1e}.node-system-packages>.main table tr td:nth-last-child(1){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,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,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,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:darkolivegreen !important}.notice{background-color:#483d8b !important;background-color:var(--dark-primary) !important}.cbi-section.fade-in .cbi-title>div:last-child span{background:none!important;color:#ced4da}.cbi-input-find,.cbi-input-save,.cbi-button-add,.cbi-button-save,.cbi-button-find,.cbi-input-reload,.cbi-button-reload{color:#fff !important;background:darkolivegreen !important;border-color:darkolivegreen !important}.cbi-button-reset,.cbi-input-remove{color:#fff !important;background-color:darkorange !important;border-color:darkorange !important}.cbi-page-actions .cbi-button-apply,.cbi-section-actions .cbi-button-edit,.cbi-button-edit.important,.cbi-button-apply.important,.cbi-button-reload.important,.cbi-button-action.important{border:1px #483d8b solid !important;border:1px var(--dark-primary) solid !important}.btn[value="Dismiss"],.cbi-button[value="Terminate"],.cbi-button[value="Reset"],.cbi-button[value="Disabled"],.cbi-button[onclick^="iface_reconnect"],.cbi-button[onclick="handleReset(event)"],.cbi-button-neutral[value="Disable"]{color:#fff;border:thin solid darkorange !important;background-color:darkorange !important}fieldset[id^="cbi-apply-"]{background-color:#333333}#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:darkolivegreen !important}#cbi-wireless .td,#cbi-network .tr:first-child>.td,.table[width="100%"]>.tr:first-child>.td,[data-page="admin-network-diagnostics"] .tr>.td,.tr.table-titles>.th,.tr.cbi-section-table-titles>.th{background-color:#252526;border-bottom:black 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.error,.alert-message.error{background-color:#784f00}.alert h4,.alert-message h4{background-color:#784f00;color:#ffbf00}.alert-message [class="btn"]{background-color:#777777;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-section-remove>.cbi-button,.cbi-button-remove,.cbi-button-reset,.cbi-button-negative,.cbi-button[value="Stop"],.cbi-button[value="Kill"],.cbi-button[onclick="reboot(this)"],.cbi-button-neutral[value="Restart"]{border:thin solid darkorange !important;background-color:darkorange !important}.cbi-section,.cbi-section-error,#iptables,.Firewall form,#cbi-network>.cbi-section-node,#cbi-wireless>.cbi-section-node,#cbi-wireless>#wifi_assoclist_table,[data-tab-title],[data-page^="admin-system-admin"]:not(.node-main-login) .cbi-map:not(#cbi-dropbear),[data-page="admin-system-opkg"] #maincontent>.container{background:#1e1e1e !important;box-shadow:0 0 .5rem 0 rgba(0,0,0,0.35)}div[style="width:100%;height:300px;border:1px solid #000;background:#fff"]{background:transparent !important}[data-page="admin-system-admin"] .cbi-map h2,[data-page="admin-system-admin-password"] .cbi-map h2,[data-page="admin-system-admin"] .cbi-map .cbi-map-descr,[data-page="admin-system-admin-password"] .cbi-map .cbi-map-descr{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:darkseagreen}[data-page="admin-system-flash"] .modal .alert-message{background-color:transparent !important}[data-page="admin-system-flash"] .modal .danger{border:thin solid darkorange !important;background-color:darkorange !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,button,select,input,.cbi-dropdown{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:darkolivegreen !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:#ffffff !important;box-shadow:none;border:1px solid #3c3c3c !important}.cbi-dropdown[open]>ul.dropdown li{color:#ffffff;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:none}.ifacebadge{background-color:#333333}.cbi-dynlist>.item>span{border:1px solid #3c3c3c !important}.cbi-page-actions .cbi-button-apply,.cbi-section-actions .cbi-button-edit,.cbi-button-edit,.cbi-button-apply,.cbi-button-reload,.cbi-button-action,.cbi-button[value="Submit"],.cbi-button[value="Upload"],.cbi-button[value$="Apply"],.cbi-button[onclick="addKey(event)"]{background:#483d8b !important;background:var(--dark-primary) !important;border-color:var(--dark-primary) !important}.btn.primary,.cbi-page-actions .cbi-button-save,.cbi-page-actions .cbi-button-apply+.cbi-button-save,.cbi-button-add,.cbi-button-save,.cbi-button-positive,.cbi-button-link,.cbi-button[value="Enable"],.cbi-button[value="Scan"],.cbi-button[value^="Back"],.cbi-button-neutral[onclick="handleConfig(event)"]{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:#333333 !important;box-shadow:0 4px 8px rgba(0,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,0.35)}}[data-page=""] .main-right>#maincontent .Dashboard,[data-page="admin-dashboard"] .main-right>#maincontent .Dashboard{color:#ccc !important}[data-page=""] .main-right>#maincontent .Dashboard h3,[data-page="admin-dashboard"] .main-right>#maincontent .Dashboard h3{color:#ccc}[data-page=""] .main-right>#maincontent .Dashboard hr,[data-page="admin-dashboard"] .main-right>#maincontent .Dashboard hr{border-top:1px solid #fff}[data-page=""] .main-right>#maincontent .Dashboard .dashboard-bg,[data-page="admin-dashboard"] .main-right>#maincontent .Dashboard .dashboard-bg{background-color:#333333}[data-page=""] .main-right>#maincontent .Dashboard img.svgmonochrome,[data-page="admin-dashboard"] .main-right>#maincontent .Dashboard img.svgmonochrome{filter:invert(90%)}[data-page=""] .main-right>#maincontent .Dashboard tr,[data-page="admin-dashboard"] .main-right>#maincontent .Dashboard tr{border-top:thin solid #4d4d4d}[data-page=""] .main-right>#maincontent .Dashboard tr:last-child,[data-page="admin-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:nth-child(1) td.parent-icon{background:#1e1e1e !important}[data-page^="admin-services-openclash"] .oc{--bg-light:#1e1e1e !important;--bg-gray:#1e1e1e !important}[data-page^="admin-services-openclash"] .oc .developer-container{background:transparent !important}[data-page^="admin-services-openclash"] .config-upload-content{background:#1e1e1e !important}[data-page^="admin-services-openclash"] .cbi-tabmenu::-webkit-scrollbar-thumb{background-color:#5b5b5b}[data-page^="admin-services-openclash"] .cbi-tabmenu::-webkit-scrollbar-track{background-color:rgba(60,60,60,0.75)}[data-page^="admin-services-openclash"] #tab{border-color:#3c3c3c}[data-page^="admin-services-openclash"] #diag-rc-output>pre,[data-page^="admin-services-openclash"] #dns-rc-output>pre{color:#ccc;border:1px solid #3c3c3c !important;background-color:#1e1e1e}[data-page^="admin-services-openclash"] img[src$="arrow-clockwise-light.svg"],[data-page^="admin-services-openclash"] img[src$="wrench-light.svg"],[data-page^="admin-services-openclash"] img[src$="eye-light.svg"]{filter:invert(.9)}[data-page="admin-network-diagnostics"] .cbi-section{background:#252526 !important}[data-page="admin-network-diagnostics"] textarea{background:transparent;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-network"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:240, 144, 144;"],[data-page="admin-network-firewall-rules"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:240, 144, 144;"]{--zone-color-rgb:156, 79, 79 !important;color:#ccc !important}[data-page="admin-network-network"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:240, 144, 144;"] strong,[data-page="admin-network-firewall-rules"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:240, 144, 144;"] strong{color:#ccc !important}[data-page="admin-network-network"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:144, 240, 144;"],[data-page="admin-network-firewall-rules"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:144, 240, 144;"]{--zone-color-rgb:73, 126, 73 !important;color:#ccc !important}[data-page="admin-network-network"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:144, 240, 144;"] strong,[data-page="admin-network-firewall-rules"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:144, 240, 144;"] strong{color:#ccc !important}[data-page="admin-network-network"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:238, 238, 238;"],[data-page="admin-network-firewall-rules"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:238, 238, 238;"]{--zone-color-rgb:112, 112, 112 !important}[data-page="admin-network-network"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:238, 238, 238;"] strong,[data-page="admin-network-firewall-rules"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:238, 238, 238;"] strong{color:#ccc !important}[data-page="admin-network-network"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:238, 238, 238;"] strong+span,[data-page="admin-network-firewall-rules"] .cbi-dropdown .zonebadge[style*="--zone-color-rgb:238, 238, 238;"] strong+span{color:#ccc !important}[data-page="admin-system-commands"] .commandbox,[data-page="admin-system-commands-dashboard"] .commandbox{border-bottom:thin solid #333;background:#252526;box-shadow:inset 0 1px 0 rgba(0,0,0,0.2),0 1px 2px rgba(255,255,255,0.05)}.btn{background-color:#707070;color:#fff} \ No newline at end of file diff --git a/feeds/luci-lorawan-gateway/luci-theme-sensecap/less/cascade.less b/feeds/luci-lorawan-gateway/luci-theme-sensecap/less/cascade.less index 7a97ea4..0f614cb 100644 --- a/feeds/luci-lorawan-gateway/luci-theme-sensecap/less/cascade.less +++ b/feeds/luci-lorawan-gateway/luci-theme-sensecap/less/cascade.less @@ -59,6 +59,21 @@ --blur-opacity-dark: 0.5; --font-family-sans-serif: "Google Sans", "Microsoft Yahei", "WenQuanYi Micro Hei", "sans-serif", "Helvetica Neue", "Helvetica", "Hiragino Sans GB"; --dropdown-arrow-icon: url("data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBmaWxsPSJjdXJyZW50Q29sb3IiIGQ9Ik01LjI5MyA5LjI5M2ExIDEgMCAwIDEgMS40MTQgMEwxMiAxNC41ODZsNS4yOTMtNS4yOTNhMSAxIDAgMSAxIDEuNDE0IDEuNDE0bC02IDZhMSAxIDAgMCAxLTEuNDE0IDBsLTYtNmExIDEgMCAwIDEgMC0xLjQxNCIvPjwvc3ZnPg=="); + + /* SenseCAP tokens consumed by luci-app-* inline styles — overridden in dark.css */ + --sensecap-log-bg: #ffffff; + --sensecap-log-fg: #333333; + --sensecap-log-border: #cccccc; + --sensecap-chart-bg: #ffffff; + --sensecap-chart-border: #dddddd; + --sensecap-muted-bg: #f5f5f5; + --sensecap-dropzone-border: #cbd5e0; + --sensecap-dropzone-hover-bg: #f3f8e8; + --sensecap-muted-fg: #6b7280; + --sensecap-emphasis-fg: #2d3748; + --sensecap-divider: #e2e8f0; + --sensecap-neutral-btn-bg: #8898aa; + --sensecap-neutral-btn-bg-hover: #6c7a8d; } /* diff --git a/feeds/luci-lorawan-gateway/luci-theme-sensecap/less/dark.less b/feeds/luci-lorawan-gateway/luci-theme-sensecap/less/dark.less index 4a67e6f..1df812e 100644 --- a/feeds/luci-lorawan-gateway/luci-theme-sensecap/less/dark.less +++ b/feeds/luci-lorawan-gateway/luci-theme-sensecap/less/dark.less @@ -34,6 +34,23 @@ body { color: #cccccc; } +/* SenseCAP dark-mode token overrides (consumed by luci-app-* inline styles) */ +:root { + --sensecap-log-bg: #1e1e1e; + --sensecap-log-fg: #cccccc; + --sensecap-log-border: #3c3c3c; + --sensecap-chart-bg: #1e1e1e; + --sensecap-chart-border: #252526; + --sensecap-muted-bg: #252526; + --sensecap-dropzone-border: #3c3c3c; + --sensecap-dropzone-hover-bg: #2a2e1a; + --sensecap-muted-fg: #adb5bd; + --sensecap-emphasis-fg: #ced4da; + --sensecap-divider: #3c3c3c; + --sensecap-neutral-btn-bg: #4a5568; + --sensecap-neutral-btn-bg-hover: #5a6578; +} + .spinning::before { filter: invert(1); }