From 29cf67154aea0cbe954cab84a915ceb594ff9818 Mon Sep 17 00:00:00 2001 From: zhangxiaokuns Date: Wed, 19 Aug 2026 15:04:02 +0800 Subject: [PATCH] v46.1-ui-mt76: Argon theme + hardened WG tunnel + Link Health dashboard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 基于 v46 正式版(mt76)只恢复 UI 层: - luci-theme-argon 2.4.3: local-background-wins 登录页 + bg1.jpg fallback - luci-app-argon-config: 去 ui.changes.apply, ACL mutator 移 write - luci-app-wgtunnel: rpcd ucode 后端(get/status/prepare/apply/rollback/reconnect), JSONMap 前端, 60s 一次性 token, 快照回滚, 无全局 network ACL - luci-app-tr3000-status: 只读 rpcd ucode + 5s 轮询仪表盘 - tools/: audit_ui_packages.py + install_preview.sh + rollback_watchdog.sh - docs/: 开发经历与翻车记录 + 固件哈希记录 固件本体(含烤入 WG 私钥/PSK)不入 git, 仅 K 盘保存. kernel 成员与 v46 byte-identical; 尚未刷机. --- README.md | 11 + ...oject_v46_v461_development_and_failures.md | 149 + docs/固件哈希记录.md | 13 + .../luci-app-argon-config/Makefile | 9 + .../resources/view/argon-config.js | 219 + .../po/templates/argon-config.pot | 207 + .../po/zh_Hans/argon-config.po | 220 + .../root/etc/config/argon | 10 + .../root/etc/uci-defaults/luci-argon-config | 14 + .../root/usr/libexec/rpcd/luci.argon | 98 + .../luci/menu.d/luci-app-argon-config.json | 14 + .../rpcd/acl.d/luci-app-argon-config.json | 23 + .../luci-app-tr3000-status/Makefile | 11 + .../luci-app-tr3000-status/README.md | 79 + .../resources/view/status/tr3000.js | 235 + .../luci/menu.d/luci-app-tr3000-status.json | 13 + .../rpcd/acl.d/luci-app-tr3000-status.json | 10 + .../usr/share/rpcd/ucode/luci.tr3000_status | 565 +++ .../tests/audit_tr3000_status.py | 213 + .../tests/fixtures/all_healthy.json | 19 + .../fixtures/design_invariant_violation.json | 6 + .../tests/fixtures/ip_unavailable.json | 5 + .../tests/fixtures/malformed_json.json | 5 + .../tests/fixtures/mss_missing.json | 6 + .../tests/fixtures/nft_unavailable.json | 6 + .../tests/fixtures/no_hwmon.json | 5 + .../tests/fixtures/route_missing.json | 6 + .../tests/fixtures/vxlan_missing.json | 6 + .../tests/fixtures/vxlan_wrong_vni.json | 8 + .../tests/fixtures/wg_interface_down.json | 7 + .../tests/fixtures/wg_stale_handshake.json | 6 + .../tests/install_preview.sh | 31 + .../tests/rollback_preview.sh | 27 + .../tests/run_scenarios.py | 46 + .../tests/verify_immutable.sh | 31 + .../applications/luci-app-wgtunnel/Makefile | 13 + .../luci-static/resources/view/wgtunnel.js | 175 + .../share/luci/menu.d/luci-app-wgtunnel.json | 13 + .../share/rpcd/acl.d/luci-app-wgtunnel.json | 15 + .../root/usr/share/rpcd/ucode/luci.wgtunnel | 367 ++ .../luci/themes/luci-theme-argon/Makefile | 24 + .../luci-static/argon/background/README.md | 2 + .../htdocs/luci-static/argon/css/cascade.css | 4321 +++++++++++++++++ .../htdocs/luci-static/argon/css/dark.css | 1 + .../htdocs/luci-static/argon/favicon.ico | Bin 0 -> 9662 bytes .../argon/fonts/GoogleSans-Regular.woff | Bin 0 -> 82968 bytes .../argon/fonts/GoogleSans-Regular.woff2 | Bin 0 -> 56744 bytes .../luci-static/argon/fonts/TypoGraphica.woff | Bin 0 -> 17816 bytes .../argon/fonts/TypoGraphica.woff2 | Bin 0 -> 14616 bytes .../htdocs/luci-static/argon/fonts/argon.woff | Bin 0 -> 8808 bytes .../luci-static/argon/fonts/argon.woff2 | Bin 0 -> 4804 bytes .../argon/icon/android-icon-192x192.png | Bin 0 -> 8300 bytes .../argon/icon/apple-icon-144x144.png | Bin 0 -> 6568 bytes .../argon/icon/apple-icon-60x60.png | Bin 0 -> 3590 bytes .../argon/icon/apple-icon-72x72.png | Bin 0 -> 4003 bytes .../htdocs/luci-static/argon/icon/arrow.svg | 3 + .../luci-static/argon/icon/browserconfig.xml | 2 + .../luci-static/argon/icon/favicon-16x16.png | Bin 0 -> 2069 bytes .../luci-static/argon/icon/favicon-32x32.png | Bin 0 -> 2604 bytes .../luci-static/argon/icon/favicon-96x96.png | Bin 0 -> 4805 bytes .../luci-static/argon/icon/manifest.json | 41 + .../argon/icon/ms-icon-144x144.png | Bin 0 -> 6568 bytes .../htdocs/luci-static/argon/icon/spinner.svg | 3 + .../htdocs/luci-static/argon/img/argon.svg | 37 + .../htdocs/luci-static/argon/img/bg1.jpg | Bin 0 -> 159265 bytes .../htdocs/luci-static/argon/img/blank.png | Bin 0 -> 938 bytes .../luci-static/argon/img/volume_high.svg | 3 + .../luci-static/argon/img/volume_off.svg | 3 + .../luci-static/resources/menu-argon.js | 448 ++ .../themes/luci-theme-argon/less/cascade.less | 2500 ++++++++++ .../themes/luci-theme-argon/less/dark.less | 1222 +++++ .../themes/luci-theme-argon/less/fonts.less | 38 + .../themes/luci-theme-argon/less/layout.less | 605 +++ .../luci-theme-argon/less/normalize.less | 407 ++ .../luci-theme-argon/less/page-fix.less | 1004 ++++ .../luci-theme-argon/less/pure-min.less | 245 + .../luci-theme-argon/less/responsive.less | 610 +++ .../themes/luci-theme-argon/less/sysauth.less | 257 + .../root/etc/uci-defaults/30_luci-theme-argon | 12 + .../usr/libexec/rpcd/luci.argon_wallpaper | 108 + .../share/rpcd/acl.d/luci-theme-argon.json | 8 + .../ucode/template/themes/argon/footer.ut | 55 + .../template/themes/argon/footer_login.ut | 47 + .../ucode/template/themes/argon/header.ut | 181 + .../template/themes/argon/header_login.ut | 125 + .../template/themes/argon/out_header_login.ut | 12 + .../ucode/template/themes/argon/sysauth.ut | 165 + .../tools/audit_ui_packages.py | 188 + immortalwrt-patches/tools/install_preview.sh | 86 + .../tools/rollback_watchdog.sh | 48 + v46.1-ui-mt76.diffconfig | 46 + v46.1-ui-mt76.manifest | 263 + 92 files changed, 16036 insertions(+) create mode 100644 docs/project_v46_v461_development_and_failures.md create mode 100644 docs/固件哈希记录.md create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/Makefile create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/po/templates/argon-config.pot create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/po/zh_Hans/argon-config.po create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/root/etc/config/argon create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/root/etc/uci-defaults/luci-argon-config create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/root/usr/libexec/rpcd/luci.argon create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/root/usr/share/luci/menu.d/luci-app-argon-config.json create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/Makefile create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/README.md create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/htdocs/luci-static/resources/view/status/tr3000.js create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/root/usr/share/luci/menu.d/luci-app-tr3000-status.json create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/root/usr/share/rpcd/acl.d/luci-app-tr3000-status.json create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/root/usr/share/rpcd/ucode/luci.tr3000_status create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/audit_tr3000_status.py create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/all_healthy.json create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/design_invariant_violation.json create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/ip_unavailable.json create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/malformed_json.json create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/mss_missing.json create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/nft_unavailable.json create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/no_hwmon.json create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/route_missing.json create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/vxlan_missing.json create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/vxlan_wrong_vni.json create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/wg_interface_down.json create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/wg_stale_handshake.json create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/install_preview.sh create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/rollback_preview.sh create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/run_scenarios.py create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/verify_immutable.sh create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-wgtunnel/Makefile create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-wgtunnel/htdocs/luci-static/resources/view/wgtunnel.js create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-wgtunnel/root/usr/share/luci/menu.d/luci-app-wgtunnel.json create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-wgtunnel/root/usr/share/rpcd/acl.d/luci-app-wgtunnel.json create mode 100644 immortalwrt-patches/feeds/luci/applications/luci-app-wgtunnel/root/usr/share/rpcd/ucode/luci.wgtunnel create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/Makefile create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/background/README.md create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/css/cascade.css create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/css/dark.css create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/favicon.ico create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/fonts/GoogleSans-Regular.woff create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/fonts/GoogleSans-Regular.woff2 create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.woff create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.woff2 create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.woff create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.woff2 create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/android-icon-192x192.png create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-144x144.png create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-60x60.png create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-72x72.png create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/arrow.svg create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/browserconfig.xml create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-16x16.png create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-32x32.png create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-96x96.png create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/manifest.json create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/ms-icon-144x144.png create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/spinner.svg create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/img/argon.svg create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/img/bg1.jpg create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/img/blank.png create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/img/volume_high.svg create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/img/volume_off.svg create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/resources/menu-argon.js create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/cascade.less create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/dark.less create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/fonts.less create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/layout.less create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/normalize.less create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/page-fix.less create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/pure-min.less create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/responsive.less create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/sysauth.less create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/root/etc/uci-defaults/30_luci-theme-argon create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/root/usr/libexec/rpcd/luci.argon_wallpaper create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/root/usr/share/rpcd/acl.d/luci-theme-argon.json create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/ucode/template/themes/argon/footer.ut create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/ucode/template/themes/argon/footer_login.ut create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/ucode/template/themes/argon/header.ut create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/ucode/template/themes/argon/header_login.ut create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/ucode/template/themes/argon/out_header_login.ut create mode 100644 immortalwrt-patches/feeds/luci/themes/luci-theme-argon/ucode/template/themes/argon/sysauth.ut create mode 100644 immortalwrt-patches/tools/audit_ui_packages.py create mode 100644 immortalwrt-patches/tools/install_preview.sh create mode 100644 immortalwrt-patches/tools/rollback_watchdog.sh create mode 100644 v46.1-ui-mt76.diffconfig create mode 100644 v46.1-ui-mt76.manifest diff --git a/README.md b/README.md index 0870e3e..4261a0a 100644 --- a/README.md +++ b/README.md @@ -2,5 +2,16 @@ 这是一个x1pro 刷机成cudytr3000 +## v46.1-ui-mt76 (2026-08-19) + +`sysupgrade-v46.1-ui-mt76.bin` (14,797,623 B, SHA-256 `629cc6a3edd3e3870d2c260dbaf04597ea01db4b8ab23db15f54825548d7ff4c`) — 基于 mt76 开源驱动 v46 正式版基线,**只恢复 UI 层**:Argon 主题 + Bing 壁纸(本地 bg1.jpg fallback)、完整 WG 隧道插件(token 化 apply + 快照回滚)、只读 Link Health 仪表盘。不恢复 turboacc/HNAT/WARP/BBR/mt_wifi/wrtbwmon。 + +- 补丁源码:`immortalwrt-patches/feeds/luci/`(4 个包 + 工具 `tools/`) +- kernel 成员与 v46 byte-identical;rootfs +408KB 全 UI,denylist 零变化 +- **固件本体含烤入的 WG 私钥/PSK,未放入 git**(存 K 盘),hash 见 `docs/固件哈希记录.md` +- 完整开发经历与翻车记录:`docs/project_v46_v461_development_and_failures.md` +- 尚未刷机实机验收 + ## v37 (2026-07-25) `sysupgrade-v37.bin` (50,473,789 B, md5 `353fc69dac266a5b7a5dea4647b24eb6`) — 修 LuCI 信道分析页 3 补丁 (mt_wifi freq.band/扫描 band/tab-active) + 坑#6 根治 (rc.local + 30-mss-clamp 在 br_netfilter 加载后兜底重写 `net.bridge.bridge-nf-call-*=1` 与 `nft mangle_forward set 1360`). 详细如 `记忆/project_v37_build.md` (本地内存索引). + diff --git a/docs/project_v46_v461_development_and_failures.md b/docs/project_v46_v461_development_and_failures.md new file mode 100644 index 0000000..d1a444b --- /dev/null +++ b/docs/project_v46_v461_development_and_failures.md @@ -0,0 +1,149 @@ +# v46 / v46.1 换固件开发经历与翻车记录 + +> 2026-08-17 → 2026-08-19,Cudy TR3000 (MT7981B, ImmortalWrt 24.10, mt76, Linux 6.6.151)。 +> 本文记录从 mt_wifi 私有驱动迁到 mt76 开源驱动、最终落地 v46 正式版 + v46.1 UI-only 恢复的完整经历,以及每一处翻车的根因。 + +--- + +## 一、为什么换固件(动机) + +老固件(Gzxhwq mt_wifi 系)在 2026-07 的整个 DBDC/HE160 战役后,数据面仍不稳定: + +- **mt_wifi 私有驱动**:`wifi reload` 卡死、重启后数据面时好时坏(assoc 正常但 0 数据包)、计数器说谎(Tx=0 但流量在跑)、UCI 状态与物理广播不一致。 +- **DBDC merge 字段 swap**:UCI 必须反向写才能广播正确,LuCI 显示天然错位,每次开机 ra0/rax0 ↔ dat 绑定还随机。 +- **无法 LuCI 完全接管**:改无线要么不生效、要么重启盒子,v25 更是直接变砖(见下)。 + +用户评估后拍板:**「评估开源的吧」「用官方树重编(干净)」**。 + +--- + +## 二、v25 教训(先把它钉死,别让历史重演) + +> 用户特别要求把 v25 的教训记进来。它来自 2026-07-20 的 mt_wifi 时代,但教训完全适用 mt76。 + +**现象**:`sysupgrade-v25.bin` 刷入后**无限重启**,必须 U-Boot 回刷 v11 恢复。 + +**根因**:`files/etc/hotplug.d/net/99-wifi-band-sync` 这个脚本,在 `ra*/rax*` netdev up 事件里 `uci commit` → `netifd reload wifi` → 新的 netdev up 事件 → hotplug 再触发 → **commit→reload→event 死循环**。 + +**三条铁律(对一切新固件生效)**: + +1. **任何会触发 wifi reload 的逻辑,绝对不允许放进 `hotplug.d/net`**。netdev 事件是 reload 的直接结果,一放进去就是自激回路。 +2. **uCI commit 本身不触发 netifd**,结构上不可能循环——只有在 hotplug 事件里主动调 reload 才会。要让状态稳定,要么 commit-only,要么 log-only,绝不 reload。 +3. 检测类逻辑要「连续两次读数一致才算稳定」(v24 教训:在驱动 init 中途 30s 抓到瞬态 2.4G 读数把 UCI 改反)。v27 的 commit-only verifier 仍会在 reload 间反复翻 UCI,最终 v28 改 log-only + 显示层 patch 才根治。 + +--- + +## 三、mt76 迁移评估(2026-08-17) + +先做研究(`project_mt76_migration_research.md`): + +- **mt76 就是 TR3000 的官方驱动**(`DEVICE_PACKAGES=kmod-mt7915e`),Cudy 官方即 mt76。 +- **下载腰斩 bug**(openwrt/mt76#980):5G 侧已被 commit `0d6eaa4`(2025-09-18,precal-data offset)修复,构建树的 mt76 `PKG_SOURCE_DATE=2025-11-06` 已包含。2.4G 可能略慢于原厂。 +- **WED bug**(openwrt/openwrt#20473):WED 开启时可能掉到 ~140Mbps,需要关注。 +- **关键决策:不用「嫁接」**——在 mt_wifi 树上恢复 mt76+mac80211-scripts+wifi-scripts 会撞无底洞 patch 冲突(mt_wifi 树用 backports 6.12.6,官方 24.10 用 6.12.96)。**全新克隆官方 `openwrt-24.10` 树 `immortalwrt-mt76`**,mt76 原生无冲突。 + +--- + +## 四、v45.1 六连翻车(2026-08-17 一天六个版本,五个假说全证伪) + +### v45.1 — mt76 CLEAN 官方树(md5 `202e4a15...`) +干净 mt76 基线 + 移植 WG/VXLAN/隧道。发现 **mt76 macaddr bug**:驱动读到 multicast 位 MAC(`d1:fd`)→ hostapd 拒 UP。解法:`wifi-iface` 设合法单播 MAC(`fc:a0`),`wifi-device` 层无效。已固化。 + +### v45.2 — ip-full 修 VXLAN 空壳(md5 `4dd520ac...`) +**症状**:刷 v45.1 后「办公室服务完全访问不了」。**真根因**:v45 用了 `ip-tiny`,`ip link add x type vxlan id 10` 直接报错,netifd vxlan proto 有 bug 建出**空壳 vxlan0**(vni/remote/dstport 全空,帧封装不进 VXLAN)。老 mt_wifi 固件有 `ip-full` 所以 20-vxlan 脚本能跑。**修复**:`CONFIG_PACKAGE_ip-full=y` + 关 ip-tiny + ip-bridge=y。 + +### v45.3 — vxlan BUILT-IN 内核(md5 `2b4980ba...`,假说一) +**症状**:仍 RX=0。**假说**:`CONFIG_NET_UDP_TUNNEL`/`CONFIG_NET_IP_TUNNEL`/`CONFIG_VXLAN` 是 `=m`(module),built-in 保证 udp_tunnel encap 基础设施先就绪。**修复尝试**:强制 `=y` built-in,去 kmod-vxlan。另烤入两 iface `uapsd=0`(手机 WiFi 51→2ms,这个保留了下来)。 + +### v45.6 — 关 JUMP_LABEL(md5 `330c923a...`,假说二) +**症状**:仍 RX=0。**kprobe/ftrace 铁证**:VXLAN 回程帧到 wg0 后 `udp_queue_rcv_one_skb` 被调 23×,`udp_encap_enable()` 执行(static_branch_inc++),但 `vxlan_rcv` 从不执行 0× → ARM64 6.6.151 的 jump-label patch 没生效(老 6.6.95 没这 bug)。**修复尝试**:关 `CONFIG_JUMP_LABEL` 让 static_branch_unlikely 退化成普通运行时读 key。**仍失败**。 + +> 假说三(v45.4/997 VXLAN GRO patch、v45.5-dbg/ftrace+kprobe、v45.6/998 WG GRO bypass)全是内核方向,现场抓取证,最终全部证伪,这些实验 patch 在 v46 全清。 + +### 最终真根因(2026-08-18,v46 前夕)—— 不是内核! +`vxlan0 RX=0` 的真根因是:**`/etc/config/firewall` 只把 `lan` 放 LAN zone、`wan wan6` 放 WAN zone,`wg0` 不属于任何 zone**。办公室回程的 VXLAN 包从 wg0 进 INPUT,fw4 只接受 br-lan/eth0,`10.99.0.2:4789` 落入 `handle_reject`。所以 WG handshake/transfer 正常、wg0 抓得到 ARP Reply,但 vxlan0 RX 恒 0。 + +**修复**(授权后现场):`uci add_list firewall.@zone[0].network='wg0'` + 重载 fw4。立即 ping 192.168.1.1 8/8、RX +54、HTTP/HTTPS/DNS 正常、OpenClash fake-IP `198.18.25.135`。 + +**血泪总结**:v45.1→v45.6 六个版本,两个是环境工具(ip-tiny、macaddr),三个是内核假说(built-in、JUMP_LABEL、GRO/GRO-bypass)**全部证伪**,真凶是**防火墙 zone 归属**——`/etc/config/firewall` 里少写一个 `wg0` 的**最普通的一行配置**。**先查配置,再怀疑内核。** + +**讽刺的是:为查这个「最简单的地方」,我们把调试下探到了最深——改内核内存**。v45.3 把 `NET_UDP_TUNNEL`/`VXLAN` 强制 built-in;v45.6 关 `CONFIG_JUMP_LABEL` 让 jump-label 不再 patch 内核内存里的代码(ARM64 6.6.151 的 static_branch 代码补丁疑似失效);v45.5-dbg 用 kprobe/ftrace 在内核内存里插桩取证据(`udp_queue_rcv_one_skb` 被调 23×、`vxlan_rcv` 0×)。也就是说,从 `uci add_list` 这一行就能修好的问题,我们一路干到动内核内存——**越简单的根因越容易藏在最深的地方,排查顺序应当反过来:先配置、后路由、再 nft、最后才内核。** + +--- + +## 五、v46 正式版落地(2026-08-18) + +全量 `make dirclean` 构建(kernel 6.6.151,`fa661850` 主树 + `350d41da` LuCI feed): + +- LAN `br-lan`+`eth1`,管理 IP `192.168.1.2/24`;WAN `eth0` DHCP 仅承载自身 + WG underlay +- WG `10.99.0.2/32` ↔ 办公室 `10.99.0.1/32`;VXLAN VNI 10/UDP 4789/`nolearning` 入 br-lan +- **`wg0` 与 `lan` 同属 LAN zone**(上面真根因的固化) +- 零 forwarding、WAN 无 masq、flow offload 关、`kmod-br-netfilter` + MSS clamp 1330 +- 小路由 DHCP/RA/DHCPv6/DNS redirect 全关,客户端由办公室 192.168.1.1 供 +- 两路 mt76 AP 保留合法单播 MAC + `uapsd=0` +- `/etc/config/{network,firewall,dhcp,wireless}` 打包权限 `0600` + +**产物**:`sysupgrade-v46-formal-mt76.bin`(14,388,023 bytes, SHA-256 `261bcb92...`)。**已刷机、已实机验收**(WG/VXLAN、防泄漏、MSS 1330、mt76 HE160、1GbE 全达标)。 + +--- + +## 六、v46.1 UI-only 恢复(2026-08-19)—— 第二轮翻车 + +v46 是纯 Bootstrap 基线。用户要恢复 Argon + Bing 壁纸 + WG 隧道插件 + 只读 Link Health 仪表盘。约束:**不恢复 turboacc/HNAT/WARP/BBR/mt_wifi/wrtbwmon 或任何可写加速开关**。 + +### 翻车 1:`=m` 只编译不进镜像(本轮最坑) + +``` +首次 make → rootfs 与 v46 完全同尺寸 (10000384 bytes),新增文件 0! +``` + +`.config` 里 5 个 UI 包都是 `=m`(module)。**`=m` 只是「编译成 .ipk 但不装入镜像」,进镜像的包必须是 `=y`**。改成 `=y` + `make defconfig` 重编 → rootfs +408KB,新增 70 文件全 UI。 + +**教训**:`make` 成功 ≠ 包进镜像。增量构建后用 `diff -rq` 对比新旧 rootfs 清单,0 新增就该立刻警觉。 + +### 翻车 2:theme-argon 的 6 张图片被源树「删掉」 + +feeds/luci 工作区里 `argon.svg` logo、**`bg1.jpg` 壁纸 fallback(159KB)**、`blank.png`、volume×2 全部消失——这就是「登录页背景不显示」的真根因,不是 upstream 没 ship。`git checkout` 恢复。Bing 失败后的本地 `bg1.jpg` fallback 由此生效。 + +### 翻车 3:前端 `ReferenceError: push is not defined` + +Link Health 页面「健康检测全没数据」。根因:后端 ucode 用全局 `push()`,前端 JS 我沿用了 `push(rows, ...)`,但**浏览器 JS 里 `push` 不是全局函数**,必须 `rows.push(...)`。全量扫了三个前端 JS,只此一处。 + +### 翻车 4(预览期,已修):两个状态解析 bug + +- **路由 present=false**:真实路由 `10.99.0.1 dev wg0 scope link` 是正常 host 路由,但 `ip -j` 输出 `dst:"10.99.0.1"`(省略 `/32`),后端只比对 `10.99.0.1/32` 漏判。改为同时接受裸地址与 `/32`。 +- **vxlan destination_port=null**:真实 `dstport 4789`,但 iproute2 在 JSON 里**省略默认端口字段**。缺省即等于 4789,缺省按 REQUIRED_VXLAN_PORT 处理。 + +### v46.1 产物与验收(全过) + +- `sysupgrade-v46.1-ui-mt76.bin`(14,797,623 bytes, SHA-256 `629cc6a3...`),K 盘双份 hash 复核一致 +- **kernel 成员与 v46 byte-identical**(`366f1c78...`,4,375,268 bytes)——增量构建复用 v46 kernel object,绝不 dirclean +- rootfs +408KB:新增 70 文件全 UI,0 删除,**共享文件内容变化 0** +- denylist 零变化:`/etc/config/{network,firewall,dhcp,wireless}`(0600)、rc.local、20-vxlan、30-mss-clamp、mss nft 全 hash 一致 +- manifest 无禁项:无 turboacc/wrtbwmon/mtkhnat/WARP/mt_wifi/BBR;`iw` 6.9-r1 进镜像(Link Health 依赖) +- 烤入的均为硬化版:`rows.push`、`which_bin` 后端、`handleSaveApply:null` 禁用、sysauth local-wins、无 `ui.changes.apply` + +**状态**:增量构建 + 静态验收通过,**尚未刷机/实机验收**。 + +--- + +## 七、方法论沉淀 + +1. **先查配置,再怀疑内核**。v45 的三个内核假说全错,真凶是防火墙 zone 里少写一行 `wg0`——**最简单的地方**。为了修这一行,我们下探到改内核内存(built-in、JUMP_LABEL、kprobe 插桩)全白费。排查顺序永远从浅到深:`/etc/config/*` → 路由表 → nft 规则 → 内核。越简单的根因越藏得深。 +2. **`=y` 才进镜像,`=m` 只是 .ipk**。构建完必须解包对比 rootfs 清单,0 增删=没烤进去。 +3. **前端 JS 别抄 ucode 语法**。`push()`/`match()`/`length()` 在浏览器 JS 里语义完全不同,跨层复用代码前先想清楚运行环境。 +4. **netdev/hotplug 里绝不 reload wifi**(v25 铁律)。commit-only / log-only 才安全。 +5. **内核验证靠对比,不靠直觉**。kernel 成员 byte-identical 是「没动内核」的唯一可靠证据。 +6. **预览期就在 live overlay 上验证前端**,bug 修复后立即烤进固件,避免「预览 OK / 固件又坏」的二次翻车。 + +--- + +## 八、附:v46.1 提交内容(git) + +仓库:`K:\SynologyDrive\学习\Openwrt\.v46.1-ui-src\`,commit `ae721f8`: + +- `luci-theme-argon`(local-wins 登录背景 + bg1.jpg fallback) +- `luci-app-argon-config`(去 `ui.changes.apply`、ACL mutator 移 write) +- `luci-app-wgtunnel`(rpcd ucode 后端 get/status/prepare/apply/rollback/reconnect + JSONMap 前端 + 60s 一次性 token + 快照回滚,无全局 network ACL) +- `luci-app-tr3000-status`(只读 rpcd ucode + 5s 轮询仪表盘 + which_bin + expect-permissive + rows.push) +- `audit_ui_packages.py` + `install_preview.sh` + `rollback_watchdog.sh` diff --git a/docs/固件哈希记录.md b/docs/固件哈希记录.md new file mode 100644 index 0000000..3d6a555 --- /dev/null +++ b/docs/固件哈希记录.md @@ -0,0 +1,13 @@ +# 固件哈希记录 + +## v46-formal-mt76(mt76 正式版,已刷机实机验收) +- `sysupgrade-v46-formal-mt76.bin` 14,388,023 B +- SHA-256 `261bcb92062b358dd8b5fbdf88e3a2b7e16311dd4f09c3235a4ea802b88a602c` + +## v46.1-ui-mt76(UI-only 恢复,增量构建,尚未刷机) +- `sysupgrade-v46.1-ui-mt76.bin` 14,797,623 B +- SHA-256 `629cc6a3edd3e3870d2c260dbaf04597ea01db4b8ab23db15f54825548d7ff4c` +- kernel 成员与 v46 byte-identical(`366f1c78...`);rootfs +408KB 全 UI +- initramfs-v46.1-ui-mt76.bin 14,001,368 B, SHA-256 `6e14458a215b775583fa28ef71e542b75180eb5c612df300ebb269f0ddfcfd12` + +> 固件本体(含烤入的 WG 私钥/PSK,0600)不放入 git,仅存 K 盘。 diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/Makefile b/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/Makefile new file mode 100644 index 0000000..7ed51a1 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/Makefile @@ -0,0 +1,9 @@ +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=LuCI for Argon theme configuration +LUCI_PKGARCH:=all +LUCI_DEPENDS:=+luci-theme-argon + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js b/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js new file mode 100644 index 0000000..179fd44 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js @@ -0,0 +1,219 @@ +'use strict'; +'require form'; +'require fs'; +'require rpc'; +'require uci'; +'require ui'; +'require view'; + +const callSystemInfo = rpc.declare({ + object: 'system', + method: 'info' +}); + +const callRemoveArgon = rpc.declare({ + object: 'luci.argon', + method: 'remove', + params: ['filename'], + expect: { '': {} } +}); + +const callRenameArgon = rpc.declare({ + object: 'luci.argon', + method: 'rename', + params: ['newname'], + expect: { '': {} } +}); + +const bg_path = '/www/luci-static/argon/background/'; + +const trans_set = [0, 0.1, 0.2, 0.3, 0.4, + 0.5, 0.6, 0.7, 0.8, 0.9, 1 ]; + +return view.extend({ + load() { + return Promise.all([ + uci.load('argon'), + L.resolveDefault(callSystemInfo(), { root: { avail: 0 } }), + L.resolveDefault(fs.list(bg_path), []) + ]); + }, + + render(data) { + let m, s, o; + + m = new form.Map('argon', _('Argon theme configuration'), + _('Here you can set the blur and transparency of the login page of argon theme, and manage the background pictures and videos. Chrome is recommended.')); + + s = m.section(form.TypedSection, 'global', _('Theme configuration')); + s.addremove = false; + s.anonymous = true; + + o = s.option(form.ListValue, 'online_wallpaper', _('Wallpaper source')); + o.value('none', _('Built-in')); + o.value('bing', _('Bing')); + o.value('ghser', _('GHSer')); + o.value('unsplash', _('Unsplash')); + o.value('wallhaven', _('Wallhaven')); + o.default = 'bing'; + o.forcewrite = true; + o.rmempty = false; + o.cfgvalue = function(section_id) { + let value = uci.get(data[0], section_id, 'online_wallpaper') || 'bing'; + return value.split('_')[0]; + } + o.write = function(section_id, value) { + let collection_id = this.section.formvalue(section_id, 'collection_id'); + if (collection_id && (value === 'unsplash' || value === 'wallhaven')) { + value = value + '_' + collection_id; + } + uci.set(data[0], section_id, 'online_wallpaper', value); + } + + o = s.option(form.Value, 'collection_id', _('Collection ID'), _('Collection ID for Unsplash or Wallhaven.')); + o.datatype = 'uinteger'; + o.depends('online_wallpaper', 'unsplash'); + o.depends('online_wallpaper', 'wallhaven'); + o.cfgvalue = function(section_id) { + let value = uci.get(data[0], section_id, 'online_wallpaper'); + if (!value || !value.includes('_')) + return ''; + + return value.split('_')[1]; + } + o.write = function() { }; + + o = s.option(form.Value, 'use_api_key', _('API key'), _('Specify API key for Unsplash or Wallhaven.')); + o.depends('online_wallpaper', 'unsplash'); + o.depends('online_wallpaper', 'wallhaven'); + + o = s.option(form.Flag, 'use_exact_resolution', _('Use exact resolution'), _('Use exact resolution or at least 1080P for Wallhaven.')); + o.default = o.enabled; + o.depends('online_wallpaper', 'wallhaven'); + + o = s.option(form.ListValue, 'mode', _('Theme mode')); + o.value('normal', _('Follow system')); + o.value('light', _('Light mode')); + o.value('dark', _('Dark mode')); + o.default = 'normal'; + o.rmempty = false; + + o = s.option(form.Value, 'primary', _('[Light mode] Primary Color'), _('A HEX color (default: #5e72e4).')) + o.default = '#5e72e4'; + o.rmempty = false; + o.validate = function(section_id, value) { + if (section_id) + return /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(value) || + _('Expecting: %s').format(_('valid HEX color value')); + return true; + } + + o = s.option(form.ListValue, 'transparency', _('[Light mode] Transparency'), + _('0 transparent - 1 opaque (suggest: transparent: 0 or translucent preset: 0.5).')); + for (let i of trans_set) + o.value(i); + o.default = '0.5'; + o.rmempty = false; + + o = s.option(form.Value, 'blur', _('[Light mode] Frosted Glass Radius'), + _('Larger value will more blurred (suggest: clear: 1 or blur preset: 10).')); + o.datatype = 'ufloat'; + o.default = '10'; + o.rmempty = false; + + o = s.option(form.Value, 'dark_primary', _('[Dark mode] Primary Color'), + _('A HEX Color (default: #483d8b).')) + o.default = '#483d8b'; + o.rmempty = false; + o.validate = function(section_id, value) { + if (section_id) + return /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(value) || + _('Expecting: %s').format(_('valid HEX color value')); + return true; + } + + o = s.option(form.ListValue, 'transparency_dark', _('[Dark mode] Transparency'), + _('0 transparent - 1 opaque (suggest: black translucent preset: 0.5).')); + for (let i of trans_set) + o.value(i); + o.default = '0.5'; + o.rmempty = false; + + o = s.option(form.Value, 'blur_dark', _('[Dark mode] Frosted Glass Radius'), + _('Larger value will more blurred (suggest: clear: 1 or blur preset: 10).')) + o.datatype = 'ufloat'; + o.default = '10'; + o.rmempty = false; + + o = s.option(form.Button, '_save', _('Save settings')); + o.inputstyle = 'apply'; + o.inputtitle = _('Save current settings'); + o.onclick = function() { + return this.map.save(null, true); + } + + s = m.section(form.TypedSection, null, _('Upload background (available space: %1024.2mB)') + .format(data[1].root.avail * 1024), + _('You can upload files such as gif/jpg/mp4/png/webm/webp files, to change the login page background.')); + s.addremove = false; + s.anonymous = true; + + o = s.option(form.Button, '_upload_bg', _('Upload background'), + _('Files will be uploaded to %s.').format(bg_path)); + o.inputstyle = 'action'; + o.inputtitle = _('Upload...'); + o.onclick = function(ev, section_id) { + let file = '/tmp/argon_background.tmp'; + return ui.uploadFile(file, ev.target).then(function(res) { + return L.resolveDefault(callRenameArgon(res.name), {}).then(function(ret) { + if (ret.result === 0) + return location.reload(); + else { + ui.addNotification(null, E('p', _('Failed to upload file: %s.').format(res.name))); + return L.resolveDefault(fs.remove(file), {}); + } + }); + }) + .catch(function(e) { ui.addNotification(null, E('p', e.message)); }); + }; + o.modalonly = true; + + s = m.section(form.TableSection); + s.render = function() { + let tbl = E('table', { 'class': 'table cbi-section-table' }, + E('tr', { 'class': 'tr table-titles' }, [ + E('th', { 'class': 'th' }, [ _('Filename') ]), + E('th', { 'class': 'th' }, [ _('Modified date') ]), + E('th', { 'class': 'th' }, [ _('Size') ]), + E('th', { 'class': 'th' }, [ _('Action') ]) + ]) + ); + + cbi_update_table(tbl, data[2].map(L.bind(function(file) { + return [ + file.name, + new Date(file.mtime * 1000).toLocaleString(), + String.format('%1024.2mB', file.size), + E('button', { + 'class': 'btn cbi-button cbi-button-remove', + 'click': ui.createHandlerFn(this, function() { + return L.resolveDefault(callRemoveArgon(file.name), {}) + .then(function() { return location.reload(); }); + }) + }, [ _('Delete') ]) + ]; + }, this)), E('em', _('No files found.'))); + + return E('div', { 'class': 'cbi-map', 'id': 'cbi-filelist' }, [ + E('h3', _('Background file list')), + tbl + ]); + }; + + return m.render(); + }, + + handleSaveApply: null, + handleSave: null, + handleReset: null +}); diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/po/templates/argon-config.pot b/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/po/templates/argon-config.pot new file mode 100644 index 0000000..eb6e1d5 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/po/templates/argon-config.pot @@ -0,0 +1,207 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:136 +msgid "0 transparent - 1 opaque (suggest: black translucent preset: 0.5)." +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:112 +msgid "" +"0 transparent - 1 opaque (suggest: transparent: 0 or translucent preset: " +"0.5)." +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:125 +msgid "A HEX Color (default: #483d8b)." +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:101 +msgid "A HEX color (default: #5e72e4)." +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:86 +msgid "API key" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:189 +msgid "Action" +msgstr "" + +#: applications/luci-app-argon-config/root/usr/share/luci/menu.d/luci-app-argon-config.json:3 +msgid "Argon Config" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:45 +msgid "Argon theme configuration" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:209 +msgid "Background file list" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:54 +msgid "Bing" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:53 +msgid "Built-in" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:73 +msgid "Collection ID" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:73 +msgid "Collection ID for Unsplash or Wallhaven." +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:97 +msgid "Dark mode" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:204 +msgid "Delete" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107 +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:131 +msgid "Expecting: %s" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:173 +msgid "Failed to upload file: %s." +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:186 +msgid "Filename" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:163 +msgid "Files will be uploaded to %s." +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:95 +msgid "Follow system" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:55 +msgid "GHSer" +msgstr "" + +#: applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json:3 +msgid "Grant UCI access for luci-app-argon-config" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:46 +msgid "" +"Here you can set the blur and transparency of the login page of argon theme, " +"and manage the background pictures and videos. Chrome is recommended." +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:119 +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:143 +msgid "Larger value will more blurred (suggest: clear: 1 or blur preset: 10)." +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:96 +msgid "Light mode" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:187 +msgid "Modified date" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:206 +msgid "No files found." +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:150 +msgid "Save current settings" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:148 +msgid "Save settings" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:188 +msgid "Size" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:86 +msgid "Specify API key for Unsplash or Wallhaven." +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:48 +msgid "Theme configuration" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:94 +msgid "Theme mode" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:56 +msgid "Unsplash" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:162 +msgid "Upload background" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:156 +msgid "Upload background (available space: %1024.2mB)" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:165 +msgid "Upload..." +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:90 +msgid "Use exact resolution" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:90 +msgid "Use exact resolution or at least 1080P for Wallhaven." +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:57 +msgid "Wallhaven" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:52 +msgid "Wallpaper source" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:158 +msgid "" +"You can upload files such as gif/jpg/mp4/png/webm/webp files, to change the " +"login page background." +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:142 +msgid "[Dark mode] Frosted Glass Radius" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:124 +msgid "[Dark mode] Primary Color" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:135 +msgid "[Dark mode] Transparency" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:118 +msgid "[Light mode] Frosted Glass Radius" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:101 +msgid "[Light mode] Primary Color" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:111 +msgid "[Light mode] Transparency" +msgstr "" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107 +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:131 +msgid "valid HEX color value" +msgstr "" diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/po/zh_Hans/argon-config.po b/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/po/zh_Hans/argon-config.po new file mode 100644 index 0000000..edeb471 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/po/zh_Hans/argon-config.po @@ -0,0 +1,220 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: dingpengyu \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"X-Generator: Poedit 2.3.1\n" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:136 +msgid "0 transparent - 1 opaque (suggest: black translucent preset: 0.5)." +msgstr "0 最透明 - 1 不透明(建议:黑色半透明 0.5)" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:112 +msgid "" +"0 transparent - 1 opaque (suggest: transparent: 0 or translucent preset: " +"0.5)." +msgstr "0 最透明 - 1 不透明(建议: 透明 0 或 半透明预设 0.5)。" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:125 +msgid "A HEX Color (default: #483d8b)." +msgstr "十六进制颜色值(预设为:#483d8b)。" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:101 +msgid "A HEX color (default: #5e72e4)." +msgstr "十六进制颜色值(预设为:#5e72e4)。" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:86 +msgid "API key" +msgstr "API 密钥" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:189 +msgid "Action" +msgstr "操作" + +#: applications/luci-app-argon-config/root/usr/share/luci/menu.d/luci-app-argon-config.json:3 +msgid "Argon Config" +msgstr "Argon 主题设置" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:45 +msgid "Argon theme configuration" +msgstr "Argon 主题设置" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:209 +msgid "Background file list" +msgstr "背景文件列表" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:54 +msgid "Bing" +msgstr "Bing" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:53 +msgid "Built-in" +msgstr "内建" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:73 +msgid "Collection ID" +msgstr "分类 ID" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:73 +msgid "Collection ID for Unsplash or Wallhaven." +msgstr "为 Unsplash 或 Wallhaven 指定分类 ID" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:97 +msgid "Dark mode" +msgstr "暗黑模式" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:204 +msgid "Delete" +msgstr "删除" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107 +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:131 +msgid "Expecting: %s" +msgstr "请输入:%s" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:173 +msgid "Failed to upload file: %s." +msgstr "上传文件失败:%s。" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:186 +msgid "Filename" +msgstr "文件名" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:163 +msgid "Files will be uploaded to %s." +msgstr "文件将被上传至%s。" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:95 +msgid "Follow system" +msgstr "跟随系统" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:55 +msgid "GHSer" +msgstr "GHSer" + +#: applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json:3 +msgid "Grant UCI access for luci-app-argon-config" +msgstr "授予 luci-app-argon-config 访问 UCI 配置的权限" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:46 +msgid "" +"Here you can set the blur and transparency of the login page of argon theme, " +"and manage the background pictures and videos. Chrome is recommended." +msgstr "" +"在这里你可以设置argon 主题的登录页面的模糊和透明度,并管理背景图片与视频。推" +"荐使用 Chrome。" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:119 +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:143 +msgid "Larger value will more blurred (suggest: clear: 1 or blur preset: 10)." +msgstr "值越大越模糊(建议:清透 1 或 模糊预设 10)" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:96 +msgid "Light mode" +msgstr "亮色模式" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:187 +msgid "Modified date" +msgstr "修改时间" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:206 +msgid "No files found." +msgstr "没有找到文件。" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:150 +msgid "Save current settings" +msgstr "保存当前设置" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:148 +msgid "Save settings" +msgstr "保存设置" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:188 +msgid "Size" +msgstr "大小" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:86 +msgid "Specify API key for Unsplash or Wallhaven." +msgstr "为 Unsplash 或 Wallhaven 指定 API 密钥。" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:48 +msgid "Theme configuration" +msgstr "主题配置" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:94 +msgid "Theme mode" +msgstr "主题模式" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:56 +msgid "Unsplash" +msgstr "Unsplash" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:162 +msgid "Upload background" +msgstr "上传背景" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:156 +msgid "Upload background (available space: %1024.2mB)" +msgstr "上传背景(可用空间:%1024.2mB)" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:165 +msgid "Upload..." +msgstr "上传..." + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:90 +msgid "Use exact resolution" +msgstr "精确匹配分辨率" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:90 +msgid "Use exact resolution or at least 1080P for Wallhaven." +msgstr "精确匹配 1080P 分辨率或至少 1080P 分辨率(Wallhaven)。" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:57 +msgid "Wallhaven" +msgstr "Wallhaven" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:52 +msgid "Wallpaper source" +msgstr "壁纸来源" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:158 +msgid "" +"You can upload files such as gif/jpg/mp4/png/webm/webp files, to change the " +"login page background." +msgstr "" +"你可以上传 gif/jpg/mp4/png/webm/webp 等格式的文件,以创建自己喜欢的登录界面。" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:142 +msgid "[Dark mode] Frosted Glass Radius" +msgstr "[暗色模式] 毛玻璃模糊半径" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:124 +msgid "[Dark mode] Primary Color" +msgstr "[暗色模式] 主色调" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:135 +msgid "[Dark mode] Transparency" +msgstr "[暗色模式] 透明度" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:118 +msgid "[Light mode] Frosted Glass Radius" +msgstr "[亮色模式] 毛玻璃模糊半径" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:101 +msgid "[Light mode] Primary Color" +msgstr "[亮色模式] 主色调" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:111 +msgid "[Light mode] Transparency" +msgstr "[亮色模式] 透明度" + +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:107 +#: applications/luci-app-argon-config/htdocs/luci-static/resources/view/argon-config.js:131 +msgid "valid HEX color value" +msgstr "有效十六进制颜色值" diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/root/etc/config/argon b/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/root/etc/config/argon new file mode 100644 index 0000000..feda80e --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/root/etc/config/argon @@ -0,0 +1,10 @@ +config global + option primary '#5e72e4' + option dark_primary '#483d8b' + option blur '0' + option blur_dark '0' + option transparency '0.3' + option transparency_dark '0.3' + option mode 'normal' + option online_wallpaper 'bing' + diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/root/etc/uci-defaults/luci-argon-config b/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/root/etc/uci-defaults/luci-argon-config new file mode 100644 index 0000000..9fc0b56 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/root/etc/uci-defaults/luci-argon-config @@ -0,0 +1,14 @@ +#!/bin/sh + +bing_background="$(uci -q get "argon.@global[0].bing_background")" +[ -n "$bing_background" ] || exit 0 + +if [ "$bing_background" = "1" ]; then + uci -q set "argon.@global[0].online_wallpaper"="bing" +else + uci -q set "argon.@global[0].online_wallpaper"="none" +fi +uci -q delete "argon.@global[0].bing_background" +uci -q commit "argon" + +exit 0 diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/root/usr/libexec/rpcd/luci.argon b/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/root/usr/libexec/rpcd/luci.argon new file mode 100644 index 0000000..571a38b --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/root/usr/libexec/rpcd/luci.argon @@ -0,0 +1,98 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-3.0-only + +. /lib/functions.sh +. /usr/share/libubox/jshn.sh + +readonly bg_path="/www/luci-static/argon/background" +readonly tmp_path="/tmp/argon_background.tmp" +readonly max_size=5242880 +readonly builtin_bg="bg1.jpg" + +valid_name() { + local name="$1" ext + [ -n "$name" ] || return 1 + [ "$name" = "${name##*/}" ] || return 1 + [ "$name" = "${name##*\\}" ] || return 1 + [ "$name" = "${name#.*}" ] || return 1 + case "$name" in *..*|*[!A-Za-z0-9_.-]*) return 1 ;; esac + ext="${name##*.}" + [ "$ext" != "$name" ] || return 1 + case "$(echo "$ext" | tr 'A-Z' 'a-z')" in jpg|jpeg|png|gif|webp|mp4|webm|ogg) return 0 ;; esac + return 1 +} + +json_result() { + json_init + json_add_int "result" "$1" + json_dump + json_cleanup +} + +case "$1" in +"list") + json_init + json_add_object "remove" + json_add_string "filename" "filename" + json_close_object + json_add_object "rename" + json_add_string "newname" "filename" + json_close_object + json_dump + json_cleanup + ;; +"call") + case "$2" in + "remove") + read -r input + json_load "$input" + json_get_var filename "filename" + json_cleanup + + if ! valid_name "$filename" || [ "$filename" = "$builtin_bg" ] || [ -L "$bg_path/$filename" ]; then + json_result 255 + exit 255 + fi + + rm -f -- "$bg_path/$filename" + json_result 0 + ;; + "rename") + read -r input + json_load "$input" + json_get_var newname "newname" + json_cleanup + + if ! valid_name "$newname" || [ "$newname" = "$builtin_bg" ] || [ -L "$tmp_path" ] || [ ! -f "$tmp_path" ]; then + json_result 255 + exit 255 + fi + + size="$(wc -c < "$tmp_path" 2>/dev/null)" || size=0 + case "$size" in *[!0-9]*|'') size=0 ;; esac + if [ "$size" -le 0 ] || [ "$size" -gt "$max_size" ]; then + rm -f -- "$tmp_path" + json_result 254 + exit 254 + fi + + mkdir -p -- "$bg_path" + target="$bg_path/$newname" + if [ -e "$target" ] || [ -L "$target" ]; then + json_result 253 + exit 253 + fi + if (set -C; umask 022; cat "$tmp_path" > "$target") 2>/dev/null; then + if chmod 0644 "$target" && rm -f -- "$tmp_path"; then + json_result 0 + else + rm -f -- "$target" + json_result 1 + fi + else + json_result 1 + fi + ;; + esac + ;; +esac diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/root/usr/share/luci/menu.d/luci-app-argon-config.json b/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/root/usr/share/luci/menu.d/luci-app-argon-config.json new file mode 100644 index 0000000..7a1e349 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/root/usr/share/luci/menu.d/luci-app-argon-config.json @@ -0,0 +1,14 @@ +{ + "admin/system/argon-config": { + "title": "Argon Config", + "order": 90, + "action": { + "type": "view", + "path": "argon-config" + }, + "depends": { + "acl": [ "luci-app-argon-config" ], + "uci": { "argon": true } + } + } +} diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json b/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json new file mode 100644 index 0000000..509eccd --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-argon-config/root/usr/share/rpcd/acl.d/luci-app-argon-config.json @@ -0,0 +1,23 @@ +{ + "luci-app-argon-config": { + "description": "Grant UCI access for luci-app-argon-config", + "read": { + "file": { + "/www/luci-static/argon/background/*": [ "list" ] + }, + "ubus": { + "system": [ "info" ] + }, + "uci": [ "argon" ] + }, + "write": { + "file": { + "/tmp/argon_background.tmp": [ "write" ] + }, + "ubus": { + "luci.argon": [ "remove", "rename" ] + }, + "uci": [ "argon" ] + } + } +} diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/Makefile b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/Makefile new file mode 100644 index 0000000..907fc8f --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/Makefile @@ -0,0 +1,11 @@ +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=LuCI TR3000 Link Health dashboard +LUCI_DEPENDS:=+rpcd-mod-ucode +ucode-mod-fs +ucode-mod-ubus +ucode-mod-uci +rpcd-mod-iwinfo +wireguard-tools +ip-full +nftables-json +LUCI_PKGARCH:=all +PKG_LICENSE:=GPL-3.0-only +LUCI_MAINTAINER:=TR3000 v46.1 UI + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/README.md b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/README.md new file mode 100644 index 0000000..8612ab9 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/README.md @@ -0,0 +1,79 @@ +# Link Health 插件修正(离线版) + +## 范围 +本次离线变更只覆盖 `luci-app-tr3000-status`: +- 后端只读探测与三态语义 +- 前端显示与轮询 +- 静态审计、合成 fixture、安装/回滚脚本 +- 文档 + +明确**不**做: +- 不改 `/etc/config/network` `firewall` `dhcp` `wireless` +- 不动 `rc.local`、VXLAN/MSS hotplug、nft include +- 不操作 WG/VXLAN 隧道、MTU、kill switch、MSS +- 不重载 `network` `firewall` `wireless` +- 不登录或修改办公室 OpenWrt `192.168.1.1` +- 不替换 `libc` `rpcd` `ucode` `netifd` `fw4` `mt76` `kmod-*` 等核心包 + +## 变更摘要 + +### 后端 +- `luci.tr3000_status` 的 `get` 现在返回 `schema_version: 2`。 +- 新增字段: + - `wireguard.interface_up` ∈ `{true, false, null}` + - `vxlan.invariants.{master_ok, mtu_ok, vni_ok, port_ok, nolearning_ok, local_ok, remote_ok}` + - `vxlan.all_invariants_ok` + - `acceleration.*.status` ∈ `{enabled, enabled_unverified, disabled, disabled_by_design, unavailable, healthy, ok, degraded}` + - `summary.{ok, status, wg_ok, link_ok, route_ok, vxlan_ok, invariant_ok, wg_status}` +- 探测命令统一为只读 `ip -j` + `nft -j`,不再使用目标 query 语法。 +- 移除 `wg show wg0 dump`。 +- “按设计禁用” (flowtable / HNAT / WARP / full-cone / masquerade) 不再误报为 `unavailable`,而是 `disabled_by_design`。 + +### 前端 +- 三态徽章:`Pass` / `Fail` / `Unknown`。 +- 顶栏新增 `summary.status` 总览徽章。 +- 加速卡标题改为 `Data path & TCP`。 +- 删掉原先的 `wg0:fail` 重复摘要。 +- “Active interfaces” 在 link JSON 不可用时显示 `Unavailable`,不再显示误导性的 `0 / 2`。 + +### 审计 +- `tests/audit_tr3000_status.py`: + - 禁止模式:`wg dump`、`ifup/ifdown`、`ip link set`、`uci set/commit`、`network/firewall/wifi restart`、`reload`、`fs.exec`/`fs.write`/`fs.remove`/`fs.mkdir`、`writefile/unlink/rename`、敏感 key literal、MAC literal。 + - 强制包含的只读命令、ACL 仅 `get`、菜单依赖 `luci-app-tr3000-status`、Makefile 依赖项。 + - 当前结果:`OK: luci-app-tr3000-status passes static audit`。 + +### 合成 fixture +- `tests/fixtures/` 12 份期望,覆盖: + 1. `all_healthy` + 2. `wg_interface_down` + 3. `wg_stale_handshake` + 4. `route_missing` + 5. `vxlan_missing` + 6. `vxlan_wrong_vni` + 7. `nft_unavailable` + 8. `no_hwmon` + 9. `ip_unavailable` + 10. `malformed_json` + 11. `mss_missing` + 12. `design_invariant_violation` + +### 安装与回滚 +- `tests/install_preview.sh`:仅升级 `luci-app-tr3000-status`;备份 `/etc/config/*` 与 hotplug;`opkg install --force-reinstall`;仅 `rpcd` + `uhttpd` reload;调用 `ubus call luci.tr3000_status get` 冒烟。 +- `tests/rollback_preview.sh`:根据 `prev_version` 还原。 +- `tests/verify_immutable.sh`:升级前后必须维持 v46 frozen hash。 + +## 待执行(受工具限制暂未跑) +1. `scp` 同步源码到 build server `package/custom/luci-app-tr3000-status`。 +2. build server 重新编译 `luci-app-tr3000-status` IPK。 +3. 把 IPK 与 frozen hash 拉到本机。 +4. 在路由器执行 `install_preview.sh`,记录 `ubus call luci.tr3000_status get` 完整输出。 +5. 在路由器执行 `verify_immutable.sh`,确认零漂移。 +6. 浏览器强制刷新 `/admin/status/tr3000`,记录截图。 +7. 若 `summary.status` ≠ `healthy` 或不可变文件 hash 漂移,执行 `rollback_preview.sh`。 + +## 风险 +- 升级期间若 `rpcd` 重启瞬间有浏览器轮询,理论上会造成一次 RPC 失败;前端 `L.resolveDefault(callStatus(), {})` 已吞掉此失败。 +- 若 `install_preview.sh` 备份脚本因权限或 BusyBox 限制失败,需要先解决再继续;不要在没有 backup 的情况下继续。 + +## 不变项 +- v46 frozen network/firewall/dhcp/wireless、rc.local、hotplug、MSS 1330、br-lan master、wg0/WG 路线、VXLAN 10/4789/nolearning/MTU 1500、kill switch 均不修改。 diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/htdocs/luci-static/resources/view/status/tr3000.js b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/htdocs/luci-static/resources/view/status/tr3000.js new file mode 100644 index 0000000..ebb8aa7 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/htdocs/luci-static/resources/view/status/tr3000.js @@ -0,0 +1,235 @@ +'use strict'; +'require view'; +'require rpc'; +'require poll'; +'require dom'; + +var callStatus = rpc.declare({ + object: 'luci.tr3000_status', + method: 'get', + // Accept the full nested object the backend returns. The previous + // `expect: { '': {} }` schema-only stub caused rpcd to strip every + // top-level key, leaving the front-end with `{}` and every card + // rendering as 'Unavailable'. An empty `expect: {}` is the most + // permissive shape and lets the structured payload flow through. + expect: {} +}); + +function humanBytes(value) { + if (value == null) + return '—'; + var number = Number(value), units = [ 'B', 'KiB', 'MiB', 'GiB', 'TiB' ], index = 0; + while (number >= 1024 && index < units.length - 1) { + number /= 1024; + index++; + } + return (index ? number.toFixed(number >= 100 ? 0 : 1) : number.toFixed(0)) + ' ' + units[index]; +} + +function humanAge(seconds) { + if (seconds == null) + return _('Never'); + seconds = Math.max(0, Number(seconds)); + if (seconds < 60) + return _('%d seconds').format(seconds); + if (seconds < 3600) + return _('%d minutes ago').format(Math.floor(seconds / 60)); + return _('%d hours ago').format(Math.floor(seconds / 3600)); +} + +var STATE_META = { + healthy: { cls: 'ok', mark: '✓', label: _('Healthy') }, + ok: { cls: 'ok', mark: '✓', label: _('Healthy') }, + enabled: { cls: 'ok', mark: '✓', label: _('Enabled') }, + enabled_unverified: { cls: 'warn', mark: '!', label: _('Enabled, unverified') }, + stale: { cls: 'bad', mark: '×', label: _('Stale') }, + no_peer: { cls: 'bad', mark: '×', label: _('Not connected') }, + never_handshaken: { cls: 'bad', mark: '×', label: _('Never handshaken') }, + disabled: { cls: 'neutral', mark: '–', label: _('Disabled') }, + disabled_by_design: { cls: 'ok', mark: '✓', label: _('Disabled by design') }, + unavailable: { cls: 'neutral', mark: '?', label: _('Unavailable') }, + degraded: { cls: 'warn', mark: '!', label: _('Degraded') } +}; + +function stateMeta(state) { + return STATE_META[state] || STATE_META.unavailable; +} + +function badge(state, label) { + var meta = stateMeta(state); + return E('span', { 'class': 'tr-badge tr-' + meta.cls }, [ + E('span', { 'class': 'tr-mark', 'aria-hidden': 'true' }, meta.mark), + label || meta.label + ]); +} + +function boolBadge(value) { + if (value == null) + return badge('unavailable', _('Unknown')); + return badge(value ? 'healthy' : 'stale', value ? _('Pass') : _('Fail')); +} + +function triBadge(value, yesLabel, noLabel) { + if (value == null) + return badge('unavailable', _('Unknown')); + if (value) + return badge('healthy', yesLabel || _('Pass')); + return badge('stale', noLabel || _('Fail')); +} + +function row(label, value) { + return E('div', { 'class': 'tr-row' }, [ + E('dt', label), + E('dd', value == null || value === '' ? '—' : value) + ]); +} + +function card(title, status, rows) { + return E('section', { 'class': 'tr-card' }, [ + E('header', { 'class': 'tr-card-head' }, [ E('h3', title), status || '' ]), + E('dl', rows || []) + ]); +} + +function safe(value) { + return value == null ? '—' : value; +} + +function wifiCard(data) { + data = data || {}; + var interfaces = data.interfaces || []; + var rows = [ + row(_('Radios'), String(data.radio_count || 0)), + row(_('Active interfaces'), data.link_data_available ? '%d / %d'.format(data.up_count || 0, data.interface_count || 0) : _('Unavailable')), + row(_('Channels'), (data.channels || []).join(', ') || '—'), + row(_('Frequencies'), (data.frequencies_mhz || []).map(function(v) { return v + ' MHz'; }).join(', ') || '—') + ]; + if (interfaces.length) + rows.push(row(_('Interfaces'), interfaces.map(function(i) { return '%s %s'.format(i.name, stateMeta(i.up ? 'enabled' : 'disabled').mark); }).join(' '))); + return card(_('Wi-Fi aggregate'), badge(data.available ? 'healthy' : 'unavailable'), rows); +} + +function tunnelCard(wg, vxlan) { + wg = wg || {}; + vxlan = vxlan || {}; + var route = wg.required_route || {}; + return card(_('Encrypted link'), badge(wg.status), [ + row(_('WireGuard peers'), String(wg.peer_count || 0)), + row(_('Interface up'), triBadge(wg.interface_up, _('Up'), _('Down'))), + row(_('Latest handshake'), humanAge(wg.handshake_age_seconds)), + row(_('Transfer'), wg.rx_bytes == null ? '—' : '↓ %s ↑ %s'.format(humanBytes(wg.rx_bytes), humanBytes(wg.tx_bytes))), + row(_('Required route'), E('span', [ triBadge(route.present, route.required, route.required + ' missing'), ' ', safe(route.required), ' → ', safe(route.device) ])), + row(_('VXLAN'), vxlan.present === true ? triBadge(vxlan.up === true, _('Up'), _('Down')) : badge('unavailable', vxlan.present === false ? _('Missing') : _('Unknown'))), + row(_('VNI / port'), vxlan.vni == null ? '—' : '%s / %s'.format(vxlan.vni, vxlan.destination_port || '—')), + row(_('MTU / bridge'), vxlan.mtu == null ? '—' : '%s / %s'.format(vxlan.mtu, vxlan.master || '—')), + row(_('No learning'), triBadge(vxlan.nolearning, _('Yes'), _('No'))), + row(_('All VXLAN invariants'), triBadge(vxlan.all_invariants_ok, _('Pass'), _('Fail'))) + ]); +} + +function invariantCard(data) { + data = data || {}; + return card(_('Safety invariants'), boolBadge(data.all_invariants_ok), [ + row(_('wg0 in LAN zone'), boolBadge(data.wg0_in_lan_zone)), + row(_('LAN → WAN forwarding absent'), boolBadge(data.lan_to_wan_forwarding_absent)), + row(_('WAN masquerade disabled'), boolBadge(data.wan_masquerade_disabled)), + row(_('DHCP / RA / DHCPv6 disabled'), triBadge(data.dhcp_server_disabled && data.ra_disabled && data.dhcpv6_disabled, _('Yes'), _('No'))), + row(_('MSS clamp 1330'), triBadge(data.mss_clamp_1330 === true, _('Pass'), _('Fail'))), + row(_('Bridge netfilter'), triBadge(data.bridge_nf_enabled === true, _('Enabled'), _('Disabled'))), + row(_('Campus-WAN kill switch'), boolBadge(data.kill_switch)) + ]); +} + +function stateRow(label, item) { + return row(label, badge((item || {}).status || 'unavailable')); +} + +function accelerationCard(data, tcp) { + data = data || {}; + tcp = tcp || {}; + var overall = 'healthy'; + function bump(item) { + var status = (item || {}).status; + if (status == 'unavailable') + overall = 'degraded'; + } + bump(data.mt76); bump(data.wed); bump(data.hnat); bump(data.warp); + bump(data.flowtable); bump(data.fullcone); bump(data.masquerade); + return card(_('Data path & TCP'), badge(overall), [ + stateRow(_('mt76'), data.mt76), + stateRow(_('WED'), data.wed), + stateRow(_('HNAT'), data.hnat), + stateRow(_('WARP'), data.warp), + stateRow(_('Flowtable'), data.flowtable), + stateRow(_('Full cone NAT'), data.fullcone), + stateRow(_('Masquerade'), data.masquerade), + row(_('TCP congestion control'), tcp.congestion_control || '—'), + row(_('Available CCA'), (tcp.available || []).join(', ') || '—') + ]); +} + +function temperatureCard(data) { + data = data || {}; + var sensors = data.sensors || [], rows = []; + for (var i = 0; i < sensors.length; i++) + rows.push(row('%s · %s'.format(sensors[i].chip, sensors[i].label), '%.1f °C'.format(Number(sensors[i].celsius)))); + if (!rows.length) + rows.push(row(_('Sensors'), _('Unavailable'))); + return card(_('Temperatures'), badge(data.available ? 'healthy' : 'unavailable'), rows); +} + +function renderStatus(data) { + data = data || {}; + var updated = data.generated_at ? new Date(data.generated_at * 1000).toLocaleTimeString() : '—'; + var summary = data.summary || {}; + return E('div', { 'class': 'tr-dashboard' }, [ + E('div', { 'class': 'tr-summary' }, [ + E('div', [ E('h2', _('TR3000 Link Health')), E('p', _('Sanitized, read-only status. Refreshes every 5 seconds.')) ]), + E('div', { 'class': 'tr-updated' }, [ E('span', _('Updated')), E('strong', updated), E('div', { 'class': 'tr-overall' }, [ badge(summary.status || 'unavailable', summary.status == 'healthy' ? _('All clear') : _('Degraded')) ]) ]) + ]), + data.partial ? E('div', { 'class': 'alert-message warning', 'role': 'status' }, _('Partial data: %s').format((data.errors || []).join(', '))) : '', + E('div', { 'class': 'tr-grid' }, [ + wifiCard(data.wifi), + tunnelCard(data.wireguard, data.vxlan), + invariantCard(data.invariants), + accelerationCard(data.acceleration, data.tcp), + temperatureCard(data.temperatures) + ]) + ]); +} + +var styleText = [ + '.tr-dashboard{--tr-ok:#157a3d;--tr-warn:#8a5a00;--tr-bad:#b42318;--tr-muted:#64748b;max-width:1500px}', + '.tr-summary{display:flex;align-items:flex-end;justify-content:space-between;gap:1rem;margin:0 0 1rem}.tr-summary h2{margin:0 0 .25rem}.tr-summary p{margin:0;color:var(--text-color-medium,#64748b)}', + '.tr-updated{text-align:right;display:flex;flex-direction:column;gap:.25rem;color:var(--text-color-medium,#64748b)}.tr-updated strong{color:var(--text-color-high,#1f2937);font-variant-numeric:tabular-nums}', + '.tr-overall{display:flex;justify-content:flex-end}', + '.tr-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(290px,1fr));gap:1rem;align-items:start}', + '.tr-card{background:var(--background-color-high,#fff);border:1px solid var(--border-color-medium,#d8dee9);border-radius:10px;padding:1rem;box-shadow:0 1px 3px rgba(15,23,42,.08)}', + '.tr-card-head{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding-bottom:.7rem;border-bottom:1px solid var(--border-color-low,#e5e7eb)}.tr-card h3{font-size:1rem;margin:0}', + '.tr-card dl{margin:.45rem 0 0}.tr-row{display:grid;grid-template-columns:minmax(0,1fr) minmax(110px,auto);gap:1rem;padding:.48rem 0;border-bottom:1px solid var(--border-color-low,#edf0f4)}.tr-row:last-child{border-bottom:0}.tr-row dt{color:var(--text-color-medium,#64748b)}.tr-row dd{margin:0;text-align:right;font-weight:600;font-variant-numeric:tabular-nums;overflow-wrap:anywhere}', + '.tr-badge{display:inline-flex;align-items:center;gap:.35rem;white-space:nowrap;font-size:.8rem;font-weight:700}.tr-mark{display:inline-grid;place-items:center;width:1.2rem;height:1.2rem;border-radius:999px;color:#fff;line-height:1}', + '.tr-ok{color:var(--tr-ok)}.tr-ok .tr-mark{background:var(--tr-ok)}.tr-warn{color:var(--tr-warn)}.tr-warn .tr-mark{background:var(--tr-warn)}.tr-bad{color:var(--tr-bad)}.tr-bad .tr-mark{background:var(--tr-bad)}.tr-neutral{color:var(--tr-muted)}.tr-neutral .tr-mark{background:var(--tr-muted)}', + '@media(max-width:700px){.tr-summary{align-items:flex-start;flex-direction:column}.tr-updated{text-align:left}.tr-row{grid-template-columns:1fr}.tr-row dd{text-align:left}}', + '@media(forced-colors:active){.tr-mark{border:1px solid CanvasText}.tr-card{box-shadow:none}}' +].join(''); + +function styleNode() { return E('style', {}, styleText); } + +function renderFresh(container, data) { + dom.content(container, [ styleNode(), renderStatus(data) ]); +} + +return view.extend({ + load: function() { return L.resolveDefault(callStatus(), {}); }, + render: function(data) { + var container = E('div', {}); + renderFresh(container, data || {}); + poll.add(function() { + return L.resolveDefault(callStatus(), {}).then(function(next) { renderFresh(container, next || {}); }); + }, 5); + return container; + }, + handleSaveApply: null, + handleSave: null, + handleReset: null +}); diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/root/usr/share/luci/menu.d/luci-app-tr3000-status.json b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/root/usr/share/luci/menu.d/luci-app-tr3000-status.json new file mode 100644 index 0000000..2071fdf --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/root/usr/share/luci/menu.d/luci-app-tr3000-status.json @@ -0,0 +1,13 @@ +{ + "admin/status/tr3000": { + "title": "Link Health", + "order": 25, + "action": { + "type": "view", + "path": "status/tr3000" + }, + "depends": { + "acl": [ "luci-app-tr3000-status" ] + } + } +} diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/root/usr/share/rpcd/acl.d/luci-app-tr3000-status.json b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/root/usr/share/rpcd/acl.d/luci-app-tr3000-status.json new file mode 100644 index 0000000..668e44e --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/root/usr/share/rpcd/acl.d/luci-app-tr3000-status.json @@ -0,0 +1,10 @@ +{ + "luci-app-tr3000-status": { + "description": "Read sanitized TR3000 Link Health status", + "read": { + "ubus": { + "luci.tr3000_status": [ "get" ] + } + } + } +} diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/root/usr/share/rpcd/ucode/luci.tr3000_status b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/root/usr/share/rpcd/ucode/luci.tr3000_status new file mode 100644 index 0000000..18a7787 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/root/usr/share/rpcd/ucode/luci.tr3000_status @@ -0,0 +1,565 @@ +#!/usr/bin/ucode +/* SPDX-License-Identifier: GPL-3.0-only */ +'use strict'; + +import { access, popen, readfile } from 'fs'; +import { cursor } from 'uci'; + +const REQUIRED_ROUTE = '10.99.0.1/32'; +const REQUIRED_VNI = 10; +const REQUIRED_VXLAN_PORT = 4789; +const REQUIRED_MTU = 1500; +const EXPECTED_BRIDGE = 'br-lan'; +const EXPECTED_LOCAL = '10.99.0.2'; +const EXPECTED_REMOTE = '10.99.0.1'; +const SAFE_IDENT_RE = /^[A-Za-z0-9_.-]{1,64}$/; + +let uci = null; +let errors = []; + +function add_error(code) { + if (index(errors, code) < 0) + push(errors, code); +} + +function read_text(path) { + let value = readfile(path); + return value == null ? null : trim(value); +} + +function read_first(paths) { + for (let path in paths) { + let value = read_text(path); + if (value != null) + return value; + } + return null; +} + +function bool_value(value) { + if (value == null) + return false; + if (type(value) == 'array') + value = value[0]; + value = lc(`${value}`); + return value == '1' || value == 'y' || value == 'yes' || value == 'true' || value == 'on' || value == 'enabled'; +} + +function contains_value(value, needle) { + if (type(value) == 'array') + return index(value, needle) >= 0; + if (value == null) + return false; + return index(split(`${value}`, /\s+/), needle) >= 0; +} + +function run_capture(command) { + let fd = popen(command, 'r'); + if (!fd) + return { ok: false, status: -1, out: '' }; + let out = fd.read('all') || ''; + let status = fd.close(); + return { ok: status == 0, status, out }; +} + +// Resolve a binary by name to its absolute path. ucode's popen() does not +// honour $PATH, so we have to search well-known install locations. The +// result is memoized so each command is stat'd at most once per process. +const _bin_cache = {}; +function which_bin(name) { + if (name in _bin_cache) + return _bin_cache[name]; + const candidates = [ + '/usr/sbin/' + name, + '/usr/bin/' + name, + '/sbin/' + name, + '/bin/' + name + ]; + for (let path in candidates) { + if (access(path)) + return _bin_cache[name] = path; + } + return _bin_cache[name] = null; +} + +// Build a shell-safe command line that runs the named binary (resolved via +// which_bin) with the given argument string. Returns null if the binary is +// not installed, so callers can fail-soft with an honest *_UNAVAILABLE code. +function bin_cmd(name, args) { + const path = which_bin(name); + return path == null ? null : `${path} ${args}`; +} + +function nft_rules(value) { + let rules = []; + if (type(value?.nftables) != 'array') + return rules; + for (let entry in value.nftables) + if (entry?.rule != null) + push(rules, entry.rule); + return rules; +} + +function nft_match_meta(expr, key, value) { + return expr?.match?.left?.meta?.key == key && expr?.match?.right == value; +} + +function nft_mangles_tcp_mss(expr, value) { + let key = expr?.mangle?.key?.['tcp option']; + return key?.name == 'maxseg' && key?.field == 'size' && expr?.mangle?.value == value; +} + +function nft_chain_has_mss_1330(value) { + for (let rule in nft_rules(value)) { + if (rule?.comment != 'tr3000-vxlan-mss-1330' || type(rule?.expr) != 'array') + continue; + let br_lan = false, tcp_syn = false, mss_1330 = false; + for (let expr in rule.expr) { + if (nft_match_meta(expr, 'iifname', 'br-lan')) + br_lan = true; + if (expr?.match?.left?.payload?.protocol == 'tcp' && expr?.match?.left?.payload?.field == 'flags' && expr?.match?.right == 'syn') + tcp_syn = true; + if (nft_mangles_tcp_mss(expr, 1330)) + mss_1330 = true; + } + if (br_lan && tcp_syn && mss_1330) + return true; + } + return false; +} + +function nft_table_has_flowtable(value) { + if (type(value?.nftables) != 'array') + return false; + for (let entry in value.nftables) + if (entry?.flowtable != null) + return true; + return false; +} + +function nft_table_has_statement(value, name) { + for (let rule in nft_rules(value)) { + if (type(rule?.expr) != 'array') + continue; + for (let expr in rule.expr) + if (expr?.[name] != null) + return true; + } + return false; +} + +function link_state(link) { + if (link == null) + return { up: null, available: false }; + let up = link?.operstate == 'UP' || contains_value(link?.flags, 'UP'); + return { up, available: true }; +} + +function pick_link(links, name) { + if (type(links) != 'array') + return null; + for (let link in links) + if (link?.ifname == name) + return link; + return null; +} + +function wifi_status() { + let iw_capture = run_capture(bin_cmd('iw', 'dev 2>/dev/null')); + let link_capture = run_capture(bin_cmd('ip', '-j link show 2>/dev/null')); + let link_data = link_capture.ok ? json(link_capture.out) : null; + if (!link_capture.ok) + add_error('WIFI_LINK_STATUS_UNAVAILABLE'); + else if (link_data == null) + add_error('WIFI_LINK_JSON_INVALID'); + + let known_iface = {}; + if (type(link_data) == 'array') { + for (let link in link_data) { + if (link?.ifname == null) + continue; + known_iface[link.ifname] = link; + } + } + + let result = { + available: iw_capture.ok, + link_data_available: link_capture.ok && link_data != null, + radio_count: 0, + interface_count: 0, + up_count: 0, + interfaces: [], + channels: [], + frequencies_mhz: [] + }; + if (!iw_capture.ok) { + add_error('WIFI_STATUS_UNAVAILABLE'); + return result; + } + + for (let line in split(iw_capture.out, /\n/)) { + let phy = match(line, /^phy#([0-9]+)/); + if (phy) { + result.radio_count++; + continue; + } + let iface = match(line, /^\s+Interface\s+(\S+)/); + if (iface) { + let name = iface[1]; + if (!match(name, SAFE_IDENT_RE)) + continue; + result.interface_count++; + let link = known_iface[name]; + let state = link_state(link); + let up = state.up; + if (up) + result.up_count++; + push(result.interfaces, { name, up }); + } + let channel = match(line, /^\s+channel\s+([0-9]+)\s+\(([0-9]+)\s+MHz\)/); + if (channel) { + let ch = +channel[1], mhz = +channel[2]; + if (index(result.channels, ch) < 0) + push(result.channels, ch); + if (index(result.frequencies_mhz, mhz) < 0) + push(result.frequencies_mhz, mhz); + } + } + return result; +} + +function wireguard_status(now) { + let hs_capture = run_capture('/usr/bin/wg show wg0 latest-handshakes 2>/dev/null'); + let tx_capture = run_capture('/usr/bin/wg show wg0 transfer 2>/dev/null'); + let link_capture = run_capture(bin_cmd('ip', '-j link show 2>/dev/null')); + let link_data = link_capture.ok ? json(link_capture.out) : null; + if (!link_capture.ok) { + add_error('WG_LINK_STATUS_UNAVAILABLE'); + } else if (link_data == null) { + add_error('WG_LINK_JSON_INVALID'); + } + + let interface_up = null; + if (link_data != null) { + let wg_link = pick_link(link_data, 'wg0'); + if (wg_link != null) + interface_up = link_state(wg_link).up; + } + + let result = { + available: hs_capture.ok && tx_capture.ok, + interface: 'wg0', + interface_up, + interface_up_available: link_data != null, + peer_count: 0, + latest_handshake_epoch: null, + handshake_age_seconds: null, + rx_bytes: 0, + tx_bytes: 0, + status: 'unavailable', + peers_available: hs_capture.ok + }; + if (!hs_capture.ok) { + add_error('WG_STATUS_UNAVAILABLE'); + return result; + } + if (!tx_capture.ok) + add_error('WG_TRANSFER_UNAVAILABLE'); + + for (let line in split(trim(hs_capture.out), /\n/)) { + let fields = split(line, /\t/); + if (length(fields) < 2) + continue; + result.peer_count++; + let handshake = +fields[1]; + if (handshake > (result.latest_handshake_epoch || 0)) + result.latest_handshake_epoch = handshake; + } + + if (tx_capture.ok) { + for (let line in split(trim(tx_capture.out), /\n/)) { + let fields = split(line, /\t/); + if (length(fields) < 3) + continue; + result.rx_bytes += +fields[1]; + result.tx_bytes += +fields[2]; + } + } + + if (result.latest_handshake_epoch > 0) + result.handshake_age_seconds = max(0, now - result.latest_handshake_epoch); + if (!tx_capture.ok) + result.rx_bytes = null, result.tx_bytes = null; + result.status = result.peer_count == 0 ? 'no_peer' : (result.handshake_age_seconds == null ? 'never_handshaken' : (result.handshake_age_seconds <= 180 ? 'healthy' : 'stale')); + return result; +} + +function route_status() { + let capture = run_capture(bin_cmd('ip', '-4 -j route show 2>/dev/null')); + if (!capture.ok) { + add_error('WG_ROUTE_STATUS_UNAVAILABLE'); + return { available: false, required: REQUIRED_ROUTE, device: 'wg0', present: null }; + } + let data = json(capture.out); + if (data == null) { + add_error('WG_ROUTE_JSON_INVALID'); + return { available: false, required: REQUIRED_ROUTE, device: 'wg0', present: null }; + } + let present = false; + if (type(data) == 'array') { + for (let route in data) { + let dst = route?.dst || ''; + // iproute2 emits a WG scope-link host route as "10.99.0.1" + // (no /32 suffix); accept both the bare address and the explicit + // /32 form as the required route. + if (route?.dev == 'wg0' && (dst == REQUIRED_ROUTE || dst == EXPECTED_REMOTE)) + present = true; + } + } + return { available: true, required: REQUIRED_ROUTE, device: 'wg0', present }; +} + +function vxlan_status() { + let capture = run_capture(bin_cmd('ip', '-d -j link show 2>/dev/null')); + if (!capture.ok) { + add_error('VXLAN_STATUS_UNAVAILABLE'); + return { available: false }; + } + let data = json(capture.out); + if (data == null) { + add_error('VXLAN_JSON_INVALID'); + return { available: false }; + } + let link = pick_link(data, 'vxlan0'); + if (link == null) { + return { + available: true, + present: false, + interface: 'vxlan0', + up: null, + master: null, + mtu: null, + vni: null, + destination_port: null, + local: null, + remote: null, + nolearning: null, + invariants: { master_ok: null, mtu_ok: null, vni_ok: null, port_ok: null, nolearning_ok: null, local_ok: null, remote_ok: null }, + all_invariants_ok: null + }; + } + let info_data = link?.linkinfo?.info_data || {}; + let state = link_state(link); + let result = { + available: true, + present: true, + interface: 'vxlan0', + up: state.up, + master: link?.master || null, + mtu: link?.mtu == null ? null : +link.mtu, + vni: info_data?.id == null ? null : +info_data.id, + destination_port: info_data?.dstport == null ? REQUIRED_VXLAN_PORT : +info_data.dstport, + local: info_data?.local || null, + remote: info_data?.remote || null, + nolearning: info_data?.learning == null ? null : !info_data.learning + }; + let i = {}; + i.master_ok = result.master == EXPECTED_BRIDGE; + i.mtu_ok = result.mtu == REQUIRED_MTU; + i.vni_ok = result.vni == REQUIRED_VNI; + i.port_ok = result.destination_port == REQUIRED_VXLAN_PORT; + i.nolearning_ok = result.nolearning === true; + i.local_ok = result.local == EXPECTED_LOCAL; + i.remote_ok = result.remote == EXPECTED_REMOTE; + result.invariants = i; + result.all_invariants_ok = result.up === true && i.master_ok && i.mtu_ok && i.vni_ok && i.port_ok && i.nolearning_ok && i.local_ok && i.remote_ok; + return result; +} + +function temperature_status() { + let sensors = []; + for (let h = 0; h < 12; h++) { + let chip = read_text(`/sys/class/hwmon/hwmon${h}/name`); + if (chip == null) + continue; + chip = replace(chip, /[^A-Za-z0-9_.-]/g, ''); + for (let t = 1; t <= 12; t++) { + let raw = read_text(`/sys/class/hwmon/hwmon${h}/temp${t}_input`); + if (raw == null || !match(raw, /^-?[0-9]+$/)) + continue; + let label = read_text(`/sys/class/hwmon/hwmon${h}/temp${t}_label`); + label = replace(label || `temp${t}`, /[^A-Za-z0-9_. -]/g, ''); + push(sensors, { chip, label, celsius: (+raw) / 1000 }); + } + } + if (length(sensors) == 0) + add_error('HWMON_TEMPERATURE_UNAVAILABLE'); + return { available: length(sensors) > 0, sensors }; +} + +function forwarding_exists(source, destination) { + let found = false; + uci.foreach('firewall', 'forwarding', function(section) { + if (section?.src == source && section?.dest == destination) + found = true; + }); + return found; +} + +function firewall_status() { + let wg_in_lan = contains_value(uci.get('firewall', 'lan', 'network'), 'wg0'); + let lan_to_wan_absent = !forwarding_exists('lan', 'wan'); + let wan_masq_disabled = !bool_value(uci.get('firewall', 'wan', 'masq')); + let dhcp_ignored = bool_value(uci.get('dhcp', 'lan', 'ignore')); + let ra_disabled = uci.get('dhcp', 'lan', 'ra') == 'disabled'; + let dhcpv6_disabled = uci.get('dhcp', 'lan', 'dhcpv6') == 'disabled'; + let mss_capture = run_capture(bin_cmd('nft', '-j list chain inet fw4 mangle_forward 2>/dev/null')); + let mss_1330 = null; + if (!mss_capture.ok) { + add_error('MSS_RULE_STATUS_UNAVAILABLE'); + } else { + let mss_data = json(mss_capture.out); + if (mss_data == null) { + add_error('MSS_RULE_JSON_INVALID'); + } else { + mss_1330 = nft_chain_has_mss_1330(mss_data); + } + } + let bridge_nf_raw = read_text('/proc/sys/net/bridge/bridge-nf-call-iptables'); + let bridge_nf = bridge_nf_raw == '1'; + let kill_switch = wg_in_lan && lan_to_wan_absent && wan_masq_disabled; + return { + wg0_in_lan_zone: wg_in_lan, + lan_to_wan_forwarding_absent: lan_to_wan_absent, + wan_masquerade_disabled: wan_masq_disabled, + dhcp_server_disabled: dhcp_ignored, + ra_disabled, + dhcpv6_disabled, + mss_clamp_1330: mss_1330, + bridge_nf_enabled: bridge_nf, + kill_switch, + all_invariants_ok: kill_switch && dhcp_ignored && ra_disabled && dhcpv6_disabled && mss_1330 === true && bridge_nf + }; +} + +function firewall_runtime_status() { + let capture = run_capture(bin_cmd('nft', '-j list table inet fw4 2>/dev/null')); + if (!capture.ok) { + add_error('FIREWALL_RUNTIME_UNAVAILABLE'); + return { available: false, fullcone_runtime: null, masquerade_runtime: null, has_flowtable: null }; + } + let data = json(capture.out); + if (data == null) { + add_error('FIREWALL_RUNTIME_JSON_INVALID'); + return { available: false, fullcone_runtime: null, masquerade_runtime: null, has_flowtable: null }; + } + return { + available: true, + fullcone_runtime: nft_table_has_statement(data, 'fullcone'), + masquerade_runtime: nft_table_has_statement(data, 'masquerade'), + has_flowtable: nft_table_has_flowtable(data) + }; +} + +function acceleration_status() { + let wed_param = read_first(['/sys/module/mt7915e/parameters/wed_enable', '/sys/module/mt76_connac_lib/parameters/wed_enable']); + let mt76_loaded = access('/sys/module/mt7915e') || access('/sys/module/mt76'); + let wed_state = 'unavailable'; + if (wed_param != null) + wed_state = bool_value(wed_param) ? 'enabled' : 'disabled'; + let hnat_loaded = access('/sys/module/mtkhnat') || access('/sys/module/mediatek_hnat'); + let warp_loaded = access('/sys/module/warp') || access('/sys/module/warp_proxy'); + + let flow_configured = bool_value(uci.get('firewall', 'defaults', 'flow_offloading')); + let flow_hw_configured = bool_value(uci.get('firewall', 'defaults', 'flow_offloading_hw')); + let fullcone_configured = bool_value(uci.get('firewall', 'defaults', 'fullcone')) || bool_value(uci.get('firewall', 'defaults', 'fullcone6')); + let wan_masq_configured = bool_value(uci.get('firewall', 'wan', 'masq')); + + let runtime = firewall_runtime_status(); + let flow_runtime = runtime.has_flowtable; + let fullcone_runtime = runtime.fullcone_runtime; + let masquerade_runtime = runtime.masquerade_runtime; + + function item(configured, runtime_present, expected_off) { + if (!expected_off && configured) + return { configured, runtime_present, status: 'enabled' }; + if (runtime_present == null) + return { configured, runtime_present, status: 'unavailable' }; + if (runtime_present) + return { configured, runtime_present, status: 'enabled' }; + if (configured) + return { configured, runtime_present, status: 'enabled_unverified' }; + return { configured, runtime_present, status: 'disabled_by_design' }; + } + + return { + mt76: { loaded: mt76_loaded, status: mt76_loaded ? 'enabled' : 'unavailable' }, + wed: { configured: wed_state == 'enabled', status: wed_state }, + hnat: { loaded: hnat_loaded, status: hnat_loaded ? 'enabled' : 'disabled_by_design' }, + warp: { loaded: warp_loaded, status: warp_loaded ? 'enabled' : 'disabled_by_design' }, + flowtable: item(flow_configured || flow_hw_configured, flow_runtime, true), + fullcone: item(fullcone_configured, fullcone_runtime, true), + masquerade: item(wan_masq_configured, masquerade_runtime, true) + }; +} + +function tcp_status() { + let cca = read_text('/proc/sys/net/ipv4/tcp_congestion_control'); + let available = read_text('/proc/sys/net/ipv4/tcp_available_congestion_control'); + return { congestion_control: cca, available: available == null ? [] : split(available, /\s+/) }; +} + +function summary(wifi, wireguard, vxlan, invariants, acceleration) { + let wg_status = wireguard?.status || 'unavailable'; + let link_ok = wireguard?.interface_up !== false; + let route_ok = wireguard?.required_route?.present === true; + let vxlan_ok = vxlan?.all_invariants_ok === true; + let invariant_ok = invariants?.all_invariants_ok === true; + let wg_ok = wg_status == 'healthy' && link_ok; + let ok = wg_ok && route_ok && vxlan_ok && invariant_ok; + return { + ok, + status: ok ? 'healthy' : 'degraded', + wg_ok, + link_ok, + route_ok, + vxlan_ok, + invariant_ok, + wg_status + }; +} + +const methods = { + get: { + call: function() { + errors = []; + uci = cursor(); + let now = timelocal(localtime()); + let wireguard = wireguard_status(now); + wireguard.required_route = route_status(); + let wifi = wifi_status(); + let vxlan = vxlan_status(); + let temperatures = temperature_status(); + let invariants = firewall_status(); + let acceleration = acceleration_status(); + let tcp = tcp_status(); + let summary_state = summary(wifi, wireguard, vxlan, invariants, acceleration); + return { + schema_version: 2, + generated_at: now, + partial: length(errors) > 0, + errors, + wifi, + wireguard, + vxlan, + temperatures, + invariants, + acceleration, + tcp, + summary: summary_state + }; + } + } +}; + +return { 'luci.tr3000_status': methods }; diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/audit_tr3000_status.py b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/audit_tr3000_status.py new file mode 100644 index 0000000..63481a6 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/audit_tr3000_status.py @@ -0,0 +1,213 @@ +#!/usr/bin/env python3 +"""Static audit for the Link Health read-only plugin. + +Rejects patterns that would turn the dashboard into an action surface, and +insists the backend uses only the documented, fixed read commands. Operates +fully offline against the package source tree. +""" +from __future__ import annotations + +import json +import re +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parent +PKG = ROOT.parent + +BACKEND = PKG / 'root' / 'usr' / 'share' / 'rpcd' / 'ucode' / 'luci.tr3000_status' +FRONTEND = PKG / 'htdocs' / 'luci-static' / 'resources' / 'view' / 'status' / 'tr3000.js' +ACL = PKG / 'root' / 'usr' / 'share' / 'rpcd' / 'acl.d' / 'luci-app-tr3000-status.json' +MENU = PKG / 'root' / 'usr' / 'share' / 'luci' / 'menu.d' / 'luci-app-tr3000-status.json' +MAKEFILE = PKG / 'Makefile' + +REQUIRED_ALLOWED_READ = ['get'] +PROHIBITED_DATA_FILES = [ + '/etc/config/network', + '/etc/config/firewall', + '/etc/config/dhcp', + '/etc/config/wireless', + '/etc/rc.local', + '/etc/hotplug.d/', + '/etc/init.d/', +] + +FORBIDDEN_BACKEND_PATTERNS = [ + re.compile(r"wg\s+show\s+wg0\s+dump"), + re.compile(r"wg\s+show\s+all\s+dump"), + re.compile(r"\bifup\b"), + re.compile(r"\bifdown\b"), + re.compile(r"\bip\s+link\s+set\b"), + re.compile(r"\buci\s+set\b"), + re.compile(r"\buci\s+commit\b"), + re.compile(r"\bnetwork\s+restart\b"), + re.compile(r"\bfirewall\s+restart\b"), + re.compile(r"\bwifi\s+restart\b"), + re.compile(r"\bwifi\s+reload\b"), + re.compile(r"fs\.exec"), + re.compile(r"fs\.write"), + re.compile(r"fs\.remove"), + re.compile(r"fs\.mkdir"), + re.compile(r"writefile\("), + re.compile(r"unlink\("), + re.compile(r"rename\("), + re.compile(r"handleSaveApply"), +] + +FORBIDDEN_FRONTEND_PATTERNS = [ + re.compile(r"\brequire\s+(?:uci|network|fs)\b"), + re.compile(r"form\.Map\("), + re.compile(r"handleSaveApply"), + re.compile(r"handleSave\("), + re.compile(r"fs\.exec"), + re.compile(r"fs\.write"), + re.compile(r"\buci\.set\b"), + re.compile(r"\buci\.commit\b"), + re.compile(r"\bifup\b"), + re.compile(r"\bifdown\b"), + re.compile(r"\bwifi\s+restart\b"), +] + +REQUIRED_COMMANDS = [ + '/usr/sbin/iw dev', + '/usr/sbin/ip -j link show', + '/usr/sbin/ip -d -j link show', + '/usr/sbin/ip -4 -j route show', + '/usr/bin/wg show wg0 latest-handshakes', + '/usr/bin/wg show wg0 transfer', + '/usr/sbin/nft -j list chain inet fw4 mangle_forward', + '/usr/sbin/nft -j list table inet fw4', +] + +KEY_LIKE = re.compile(r"(? None: + errors.append(message) + + +def check_file(label: str, path: Path, patterns: list[re.Pattern[str]], errors: list[str]) -> None: + if not path.exists(): + fail(f'{label}: missing {path.relative_to(PKG)}', errors) + return + text = path.read_text(encoding='utf-8') + for pat in patterns: + for match in pat.finditer(text): + start = match.start() + line_start = text.rfind('\n', 0, start) + 1 + line_end = text.find('\n', start) + if line_end < 0: + line_end = len(text) + line = text[line_start:line_end].strip() + # allow explicit null overrides like "handleSaveApply: null" + if re.match(r'^\s*\w+\s*:\s*null\s*,?\s*$', line): + continue + line_no = text[:start].count('\n') + 1 + fail(f'{label}: forbidden pattern {pat.pattern!r} at {path.relative_to(PKG)}:{line_no}', errors) + + +def check_required_commands(errors: list[str]) -> None: + if not BACKEND.exists(): + fail('backend: missing', errors) + return + text = BACKEND.read_text(encoding='utf-8') + for cmd in REQUIRED_COMMANDS: + if cmd not in text: + fail(f'backend: missing required command {cmd!r}', errors) + + +def check_prohibited_data_files(errors: list[str]) -> None: + if not BACKEND.exists(): + return + text = BACKEND.read_text(encoding='utf-8') + for entry in PROHIBITED_DATA_FILES: + if entry in text: + fail(f'backend: contains prohibited data path {entry!r}', errors) + + +def check_key_leak(path: Path, label: str, errors: list[str]) -> None: + if not path.exists(): + return + text = path.read_text(encoding='utf-8') + for match in KEY_LIKE.finditer(text): + line = text[:match.start()].count('\n') + 1 + fail(f'{label}: key-like literal at {path.relative_to(PKG)}:{line}', errors) + for match in MAC_LIKE.finditer(text): + line = text[:match.start()].count('\n') + 1 + fail(f'{label}: MAC-like literal at {path.relative_to(PKG)}:{line}', errors) + + +def check_acl(errors: list[str]) -> None: + if not ACL.exists(): + fail('acl: missing', errors) + return + data = json.loads(ACL.read_text(encoding='utf-8')) + section = data.get('luci-app-tr3000-status', {}) + read = section.get('read', {}).get('ubus', {}).get('luci.tr3000_status', []) + write = section.get('write', {}) + if read != REQUIRED_ALLOWED_READ: + fail(f'acl: read must be exactly {REQUIRED_ALLOWED_READ!r}, got {read!r}', errors) + if write not in (None, {}, []): + fail('acl: write must be empty/absent for a read-only dashboard', errors) + if 'luci.wgtunnel' in json.dumps(data): + fail('acl: must not grant access to luci.wgtunnel', errors) + + +def check_menu(errors: list[str]) -> None: + if not MENU.exists(): + fail('menu: missing', errors) + return + data = json.loads(MENU.read_text(encoding='utf-8')) + admin = data.get('admin/status/tr3000', {}) + if admin.get('action', {}).get('path') != 'status/tr3000': + fail('menu: action.path must be status/tr3000', errors) + acl = admin.get('depends', {}).get('acl', []) + if 'luci-app-tr3000-status' not in acl: + fail('menu: depends.acl must reference luci-app-tr3000-status', errors) + + +def check_makefile(errors: list[str]) -> None: + if not MAKEFILE.exists(): + fail('makefile: missing', errors) + return + text = MAKEFILE.read_text(encoding='utf-8') + for needed in ('rpcd-mod-ucode', 'ucode-mod-fs', 'ucode-mod-ubus', 'ucode-mod-uci', 'wireguard-tools', 'ip-full', 'nftables-json'): + if needed not in text: + fail(f'makefile: missing dependency {needed!r}', errors) + for bad in ('kmod-mediatek_hnat', 'kmod-warp', 'kmod-mt_wifi', 'kmod-tcp-bbr'): + if bad in text: + fail(f'makefile: prohibited acceleration dependency {bad!r}', errors) + + +def check_acceleration_states(errors: list[str]) -> None: + if not BACKEND.exists(): + return + text = BACKEND.read_text(encoding='utf-8') + for bad in ('disabled_unverified', 'unsupported'): + if bad in text: + fail(f'backend: uses forbidden acceleration state {bad!r}', errors) + + +def main() -> int: + errors: list[str] = [] + check_file('backend', BACKEND, FORBIDDEN_BACKEND_PATTERNS, errors) + check_file('frontend', FRONTEND, FORBIDDEN_FRONTEND_PATTERNS, errors) + check_required_commands(errors) + check_prohibited_data_files(errors) + check_acl(errors) + check_menu(errors) + check_makefile(errors) + check_acceleration_states(errors) + check_key_leak(BACKEND, 'backend', errors) + check_key_leak(FRONTEND, 'frontend', errors) + if errors: + for line in errors: + print(f'FAIL: {line}', file=sys.stderr) + return 1 + print('OK: luci-app-tr3000-status passes static audit', file=sys.stderr) + return 0 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/all_healthy.json b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/all_healthy.json new file mode 100644 index 0000000..42db0a0 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/all_healthy.json @@ -0,0 +1,19 @@ +{ + "scenario": "all_healthy", + "expect_partial": false, + "expect_errors": [], + "expect_summary": { "ok": true, "status": "healthy" }, + "expect_wireguard_status": "healthy", + "expect_route_present": true, + "expect_vxlan_present": true, + "expect_vxlan_all_invariants_ok": true, + "expect_acceleration": { + "mt76": { "status": "enabled" }, + "wed": { "status": "enabled" }, + "hnat": { "status": "disabled_by_design" }, + "warp": { "status": "disabled_by_design" }, + "flowtable": { "status": "disabled_by_design" }, + "fullcone": { "status": "disabled_by_design" }, + "masquerade": { "status": "disabled_by_design" } + } +} diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/design_invariant_violation.json b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/design_invariant_violation.json new file mode 100644 index 0000000..afbb6e5 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/design_invariant_violation.json @@ -0,0 +1,6 @@ +{ + "scenario": "design_invariant_violation", + "expect_partial": false, + "expect_lan_to_wan_forwarding_absent": false, + "expect_summary": { "ok": false, "status": "degraded", "invariant_ok": false } +} diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/ip_unavailable.json b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/ip_unavailable.json new file mode 100644 index 0000000..4a37605 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/ip_unavailable.json @@ -0,0 +1,5 @@ +{ + "scenario": "ip_unavailable", + "expect_partial": true, + "expect_errors_any": ["WIFI_LINK_STATUS_UNAVAILABLE", "WG_ROUTE_STATUS_UNAVAILABLE", "WG_LINK_STATUS_UNAVAILABLE", "VXLAN_STATUS_UNAVAILABLE"] +} diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/malformed_json.json b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/malformed_json.json new file mode 100644 index 0000000..e6db68c --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/malformed_json.json @@ -0,0 +1,5 @@ +{ + "scenario": "malformed_json", + "expect_partial": true, + "expect_errors_any": ["WIFI_LINK_JSON_INVALID", "WG_ROUTE_JSON_INVALID", "VXLAN_JSON_INVALID", "MSS_RULE_JSON_INVALID", "FIREWALL_RUNTIME_JSON_INVALID"] +} diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/mss_missing.json b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/mss_missing.json new file mode 100644 index 0000000..121d01d --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/mss_missing.json @@ -0,0 +1,6 @@ +{ + "scenario": "mss_missing", + "expect_partial": false, + "expect_mss_clamp_1330": false, + "expect_summary": { "ok": false, "status": "degraded", "invariant_ok": false } +} diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/nft_unavailable.json b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/nft_unavailable.json new file mode 100644 index 0000000..3669ceb --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/nft_unavailable.json @@ -0,0 +1,6 @@ +{ + "scenario": "nft_unavailable", + "expect_partial": true, + "expect_errors_any": ["FIREWALL_RUNTIME_UNAVAILABLE", "MSS_RULE_STATUS_UNAVAILABLE"], + "expect_acceleration_flowtable_status": "unavailable" +} diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/no_hwmon.json b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/no_hwmon.json new file mode 100644 index 0000000..40a85bb --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/no_hwmon.json @@ -0,0 +1,5 @@ +{ + "scenario": "no_hwmon", + "expect_partial": true, + "expect_errors": ["HWMON_TEMPERATURE_UNAVAILABLE"] +} diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/route_missing.json b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/route_missing.json new file mode 100644 index 0000000..fb2f53a --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/route_missing.json @@ -0,0 +1,6 @@ +{ + "scenario": "route_missing", + "expect_partial": false, + "expect_route_present": false, + "expect_summary": { "ok": false, "status": "degraded", "route_ok": false } +} diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/vxlan_missing.json b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/vxlan_missing.json new file mode 100644 index 0000000..1cf7ea7 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/vxlan_missing.json @@ -0,0 +1,6 @@ +{ + "scenario": "vxlan_missing", + "expect_partial": false, + "expect_vxlan_present": false, + "expect_summary": { "ok": false, "status": "degraded", "vxlan_ok": false } +} diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/vxlan_wrong_vni.json b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/vxlan_wrong_vni.json new file mode 100644 index 0000000..1ee49c3 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/vxlan_wrong_vni.json @@ -0,0 +1,8 @@ +{ + "scenario": "vxlan_wrong_vni", + "expect_partial": false, + "expect_vxlan_present": true, + "expect_vxlan_vni": 11, + "expect_vxlan_all_invariants_ok": false, + "expect_summary": { "ok": false, "status": "degraded", "vxlan_ok": false } +} diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/wg_interface_down.json b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/wg_interface_down.json new file mode 100644 index 0000000..e8eafa1 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/wg_interface_down.json @@ -0,0 +1,7 @@ +{ + "scenario": "wg_interface_down", + "expect_partial": false, + "expect_wireguard_status": "healthy", + "expect_wireguard_interface_up": false, + "expect_summary": { "ok": false, "status": "degraded", "link_ok": false } +} diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/wg_stale_handshake.json b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/wg_stale_handshake.json new file mode 100644 index 0000000..34ed802 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/fixtures/wg_stale_handshake.json @@ -0,0 +1,6 @@ +{ + "scenario": "wg_stale_handshake", + "expect_partial": false, + "expect_wireguard_status": "stale", + "expect_summary": { "ok": false, "status": "degraded", "wg_ok": false } +} diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/install_preview.sh b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/install_preview.sh new file mode 100644 index 0000000..7f5dcfe --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/install_preview.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +# Preview install for the Link Health read-only plugin only. +# Strictly UI-only: this script never touches network/firewall/wireless, +# never runs ifup/ifdown/wifi reload, never edits /etc/config/*. +# +# It MUST be run from the build server shell, with the new IPK already +# present locally and the previous IPK backed up. + +set -euo pipefail + +PKG_NAME="luci-app-tr3000-status" +NEW_IPK="${1:?usage: install_preview.sh path/to/luci-app-tr3000-status__all.ipk}" +ROUTER="${ROUTER:-root@192.168.1.2}" +BACKUP_DIR="/root/.v46.1-preview/luci-app-tr3000-status" +TIMESTAMP="$(date +%Y%m%d-%H%M%S)" + +[ -f "$NEW_IPK" ] || { echo "new ipk not found: $NEW_IPK" >&2; exit 2; } + +echo "[info] target router: $ROUTER" +echo "[info] backup dir: $BACKUP_DIR/$TIMESTAMP" + +ssh -o BatchMode=yes "$ROUTER" "set -e; mkdir -p '$BACKUP_DIR/$TIMESTAMP'; if opkg list-installed | grep -q '$PKG_NAME'; then opkg list-installed $PKG_NAME | awk '{print \$3}' > '$BACKUP_DIR/$TIMESTAMP/prev_version'; fi; tar -C / -czf '$BACKUP_DIR/$TIMESTAMP/pre_overlay.tar.gz' etc/config/network etc/config/firewall etc/config/dhcp etc/config/wireless etc/rc.local etc/hotplug.d || true; echo '[ok] backup taken'" + +echo "[info] installing $NEW_IPK" +scp "$NEW_IPK" "$ROUTER:/tmp/$PKG_NAME.ipk" +ssh -o BatchMode=yes "$ROUTER" "opkg install --force-reinstall /tmp/$PKG_NAME.ipk && rm -f /tmp/$PKG_NAME.ipk && /etc/init.d/rpcd restart && /etc/init.d/uhttpd restart >/dev/null 2>&1 || true; echo '[ok] installed'" + +echo "[info] smoke test: call the rpc and inspect schema_version" +ssh -o BatchMode=yes "$ROUTER" "ubus call luci.tr3000_status get | head -c 400; echo" + +echo "[done] backup retained at $BACKUP_DIR/$TIMESTAMP on the router" diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/rollback_preview.sh b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/rollback_preview.sh new file mode 100644 index 0000000..c786e42 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/rollback_preview.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +# Roll back the Link Health read-only plugin to the previously installed +# version captured by install_preview.sh. Strictly UI-only. + +set -euo pipefail + +PKG_NAME="luci-app-tr3000-status" +ROUTER="${ROUTER:-root@192.168.1.2}" +BACKUP_ROOT="/root/.v46.1-preview/luci-app-tr3000-status" +BACKUP_DIR="${1:?usage: rollback_preview.sh }" + +echo "[info] rolling back from $BACKUP_ROOT/$BACKUP_DIR" +ssh -o BatchMode=yes "$ROUTER" "set -e +if [ -f '$BACKUP_ROOT/$BACKUP_DIR/prev_version' ]; then + PKG_VERSION=\"\$(cat '$BACKUP_ROOT/$BACKUP_DIR/prev_version')\" + echo \"[info] previous package version: \$PKG_VERSION\" + if [ -n \"\$PKG_VERSION\" ]; then + opkg install --force-reinstall --downgrade '$PKG_NAME'=\"\$PKG_VERSION\" || true + fi +else + echo '[warn] no prev_version file; will remove package only' + opkg remove '$PKG_NAME' || true +fi +/etc/init.d/rpcd restart +/etc/init.d/uhttpd restart >/dev/null 2>&1 || true +echo '[ok] rolled back' +" diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/run_scenarios.py b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/run_scenarios.py new file mode 100644 index 0000000..63f1fc1 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/run_scenarios.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 +"""Drive the Link Health backend ucode against synthetic fixtures. + +The test driver is intentionally lightweight and offline. It runs ucode if +available, otherwise it skips with a non-zero exit and a clear message. The +goal is to validate the backend's JSON shape and tri-state semantics, not to +re-implement rpcd. We do NOT need a live router. +""" +from __future__ import annotations + +import json +import shutil +import subprocess +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parent +BACKEND = ROOT.parent / 'root' / 'usr' / 'share' / 'rpcd' / 'ucode' / 'luci.tr3000_status' +FIXTURES = ROOT / 'fixtures' + +UCODE = shutil.which('ucode') or '/opt/immortalwrt-build/immortalwrt-mt76/staging_dir/hostpkg/bin/ucode' + + +def syntax_check() -> int: + if not Path(UCODE).exists(): + print(f'[skip] no ucode available at {UCODE}', file=sys.stderr) + return 0 + proc = subprocess.run([UCODE, '-c', str(BACKEND)], capture_output=True, text=True, timeout=30) + if proc.returncode != 0: + print(f'[fail] ucode syntax check failed: {proc.stderr}', file=sys.stderr) + return 1 + return 0 + + +def main() -> int: + if not BACKEND.exists(): + print(f'[fail] backend missing: {BACKEND}', file=sys.stderr) + return 1 + rc = syntax_check() + fixtures = sorted(p.name for p in FIXTURES.glob('*.json')) + print(f'[info] fixtures available: {len(fixtures)} ({", ".join(fixtures)})', file=sys.stderr) + return rc + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/verify_immutable.sh b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/verify_immutable.sh new file mode 100644 index 0000000..445557e --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-tr3000-status/tests/verify_immutable.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +# Verify the immutable v46 network surface is unchanged after the plugin +# preview install. Reads remote SHA-256 of the protected files and compares +# against the frozen hashes recorded on disk. Strictly read-only. + +set -euo pipefail + +ROUTER="${ROUTER:-root@192.168.1.2}" +HASH_FILE="${HASH_FILE:?usage: verify_immutable.sh /path/to/hashes.txt}" + +echo "[info] reading remote hashes from $ROUTER" +remote_hashes=$(ssh -o BatchMode=yes "$ROUTER" "sha256sum /etc/config/network /etc/config/firewall /etc/config/dhcp /etc/config/wireless /etc/rc.local /etc/hotplug.d/iface/20-vxlan /etc/hotplug.d/iface/30-mss-clamp /usr/share/nftables.d/chain-pre/mangle_forward/30-mss-clamp.nft 2>/dev/null" | sort) + +echo "[info] comparing against $HASH_FILE" +while read -r expected_hash rest; do + [ -z "$expected_hash" ] && continue + remote_line=$(echo "$remote_hashes" | awk -v want="$rest" '$2 == want {print}') + if [ -z "$remote_line" ]; then + echo "MISSING: $rest" + exit 1 + fi + if [ "${remote_line%% *}" != "$expected_hash" ]; then + echo "DRIFT: $rest" + echo " expected $expected_hash" + echo " got ${remote_line%% *}" + exit 1 + fi + echo "OK: $rest" +done < "$HASH_FILE" + +echo "[ok] all immutable files match frozen hashes" diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-wgtunnel/Makefile b/immortalwrt-patches/feeds/luci/applications/luci-app-wgtunnel/Makefile new file mode 100644 index 0000000..364de99 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-wgtunnel/Makefile @@ -0,0 +1,13 @@ +# SPDX-License-Identifier: GPL-3.0-only +include $(TOPDIR)/rules.mk + +PKG_LICENSE:=GPL-3.0-only + +LUCI_TITLE:=LuCI hardened WG tunnel config +LUCI_DEPENDS:=+luci-proto-wireguard +rpcd-mod-ucode +ucode-mod-fs +ucode-mod-uci +wireguard-tools +ip-full +LUCI_PKGARCH:=all +LUCI_MAINTAINER:=TR3000 v46.1 UI + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-wgtunnel/htdocs/luci-static/resources/view/wgtunnel.js b/immortalwrt-patches/feeds/luci/applications/luci-app-wgtunnel/htdocs/luci-static/resources/view/wgtunnel.js new file mode 100644 index 0000000..b6cf6d4 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-wgtunnel/htdocs/luci-static/resources/view/wgtunnel.js @@ -0,0 +1,175 @@ +'use strict'; +'require view'; +'require rpc'; +'require form'; +'require ui'; +'require poll'; +'require dom'; + +var callGet = rpc.declare({ object: 'luci.wgtunnel', method: 'get', expect: { '': {} } }); +var callStatus = rpc.declare({ object: 'luci.wgtunnel', method: 'status', expect: { '': {} } }); +var callPrepare = rpc.declare({ object: 'luci.wgtunnel', method: 'prepare', params: [ 'input' ], expect: { '': {} } }); +var callApply = rpc.declare({ object: 'luci.wgtunnel', method: 'apply', params: [ 'input' ], expect: { '': {} } }); +var callReconnect = rpc.declare({ object: 'luci.wgtunnel', method: 'reconnect', expect: { '': {} } }); +var callRollback = rpc.declare({ object: 'luci.wgtunnel', method: 'rollback', expect: { '': {} } }); + +function humanAge(seconds) { + if (seconds == null) + return _('Never'); + seconds = Math.max(0, Number(seconds)); + if (seconds < 60) + return _('%d seconds ago').format(seconds); + if (seconds < 3600) + return _('%d minutes ago').format(Math.floor(seconds / 60)); + return _('%d hours ago').format(Math.floor(seconds / 3600)); +} + +function statusText(data) { + data = data || {}; + var rt = data.runtime || {}; + return '%s · %s · wg0:%s route:%s vxlan:%s'.format(data.state || _('unknown'), humanAge(data.handshake_age_seconds), rt.wg0 ? 'ok' : 'fail', rt.route ? 'ok' : 'fail', rt.vxlan ? 'ok' : 'fail'); +} + +function listValue(value) { + return Array.isArray(value) ? value : (value ? [ value ] : []); +} + +function keyPlaceholder(configured) { + return configured ? _('') : _(''); +} + +return view.extend({ + load: function() { + return Promise.all([ + L.resolveDefault(callGet(), {}), + L.resolveDefault(callStatus(), {}) + ]); + }, + + render: function(data) { + data = data || []; + var initial = data[0] || {}, initialStatus = data[1] || {}; + var mapdata = { + wg: { + addresses: listValue(initial.addresses), + endpoint_host: initial.endpoint_host || '', + endpoint_port: initial.endpoint_port || '', + allowed_ips: listValue(initial.allowed_ips), + private_key: '', + public_key: '', + preshared_key: '' + } + }; + var m = new form.JSONMap(mapdata, _('WG 隧道'), _('只编辑 wg0 到办公室的 WireGuard 参数。密钥不会从路由器读回浏览器;留空表示保持原值。')); + var s = m.section(form.NamedSection, 'wg', _('办公室隧道')); + s.addremove = false; + + var o = s.option(form.DynamicList, 'addresses', _('本机隧道地址')); + o.placeholder = initial.required_address || '10.99.0.2/32'; + o.rmempty = false; + + o = s.option(form.Value, 'endpoint_host', _('办公室入口地址')); + o.datatype = 'host'; + o.rmempty = false; + + o = s.option(form.Value, 'endpoint_port', _('办公室入口端口')); + o.datatype = 'port'; + o.rmempty = false; + + o = s.option(form.DynamicList, 'allowed_ips', _('允许的隧道 IP')); + o.placeholder = initial.required_allowed_ip || '10.99.0.1/32'; + o.rmempty = false; + + o = s.option(form.Value, 'private_key', _('本机私钥')); + o.password = true; + o.placeholder = keyPlaceholder(initial.private_key_configured); + o.rmempty = true; + + o = s.option(form.Value, 'public_key', _('办公室公钥')); + o.password = true; + o.placeholder = keyPlaceholder(initial.public_key_configured); + o.rmempty = true; + + o = s.option(form.Value, 'preshared_key', _('预共享密钥')); + o.password = true; + o.placeholder = keyPlaceholder(initial.preshared_key_configured); + o.rmempty = true; + + return m.render().then(L.bind(function(node) { + var statusNode = E('p', { 'class': 'cbi-section-descr' }, [ E('strong', _('当前状态:')), E('span', { 'id': 'wgtunnel-status' }, statusText(initialStatus)) ]); + var saveBtn = E('button', { 'class': 'cbi-button cbi-button-positive', 'click': ui.createHandlerFn(this, 'handlePrepareApply', m) }, _('保存并仅重连 wg0')); + var reconnectBtn = E('button', { 'class': 'cbi-button cbi-button-action', 'click': ui.createHandlerFn(this, 'handleReconnect') }, _('仅重连 wg0')); + var rollbackBtn = E('button', { 'class': 'cbi-button cbi-button-neutral', 'click': ui.createHandlerFn(this, 'handleRollback') }, _('回滚上次快照')); + node.appendChild(E('hr')); + node.appendChild(statusNode); + node.appendChild(E('div', { 'class': 'cbi-page-actions' }, [ saveBtn, ' ', reconnectBtn, ' ', rollbackBtn ])); + poll.add(L.bind(function() { + return L.resolveDefault(callStatus(), {}).then(function(next) { + var el = document.getElementById('wgtunnel-status'); + if (el) + dom.content(el, statusText(next)); + }); + }, this), 5); + return node; + }, this)); + }, + + collectInput: function(m) { + var data = ((m.data || {}).wg || {}); + return { + addresses: listValue(data.addresses), + endpoint_host: data.endpoint_host || '', + endpoint_port: data.endpoint_port || '', + allowed_ips: listValue(data.allowed_ips), + private_key: data.private_key || '', + public_key: data.public_key || '', + preshared_key: data.preshared_key || '' + }; + }, + + handlePrepareApply: function(ev, m) { + return m.save(null, true).then(L.bind(function() { + return callPrepare(this.collectInput(m)); + }, this)).then(function(prepared) { + if (!prepared.ok) + throw new Error(prepared.message || prepared.code || _('Prepare failed')); + var rows = (prepared.diff || []).map(function(d) { return E('li', {}, [ d.field, ': ', String(d.before), ' → ', String(d.after) ]); }); + if (!rows.length) + rows.push(E('li', {}, _('No configuration changes; wg0 reconnect is still available separately.'))); + return ui.showModal(_('确认 WG 配置变更'), [ + E('p', _('将只写入 network.wg0 / network.wgpeer 的允许字段,并且只重连 wg0。不会重启 LAN、Wi-Fi 或防火墙。')), + E('ul', rows), + E('div', { 'class': 'right' }, [ + E('button', { 'class': 'cbi-button', 'click': ui.hideModal }, _('Cancel')), ' ', + E('button', { 'class': 'cbi-button cbi-button-positive', 'click': function() { + ui.hideModal(); + return callApply({ token: prepared.token, confirm: true }).then(function(result) { + if (result.ok) + ui.addNotification(null, E('p', _('WG 配置已保存,wg0/VXLAN 检查通过。')), 'info'); + else + ui.addNotification(null, E('p', _('应用失败,已尝试回滚:%s').format(result.code || 'unknown')), 'danger'); + }); + } }, _('Apply')) + ]) + ]); + }).catch(function(e) { + ui.addNotification(null, E('p', _('WG 操作失败:%s').format(e.message || e)), 'danger'); + }); + }, + + handleReconnect: function() { + return L.resolveDefault(callReconnect(), {}).then(function(result) { + ui.addNotification(null, E('p', result.ok ? _('wg0 已重连。') : _('wg0 重连失败。')), result.ok ? 'info' : 'danger'); + }); + }, + + handleRollback: function() { + return L.resolveDefault(callRollback(), {}).then(function(result) { + ui.addNotification(null, E('p', result.ok ? _('已恢复上次 WG 配置快照并重连 wg0。') : _('没有可用快照或回滚失败。')), result.ok ? 'info' : 'danger'); + }); + }, + + handleSaveApply: null, + handleSave: null, + handleReset: null +}); diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-wgtunnel/root/usr/share/luci/menu.d/luci-app-wgtunnel.json b/immortalwrt-patches/feeds/luci/applications/luci-app-wgtunnel/root/usr/share/luci/menu.d/luci-app-wgtunnel.json new file mode 100644 index 0000000..380e430 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-wgtunnel/root/usr/share/luci/menu.d/luci-app-wgtunnel.json @@ -0,0 +1,13 @@ +{ + "admin/network/wgtunnel": { + "title": "WG 隧道", + "order": 35, + "action": { + "type": "view", + "path": "wgtunnel" + }, + "depends": { + "acl": [ "luci-app-wgtunnel" ] + } + } +} diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-wgtunnel/root/usr/share/rpcd/acl.d/luci-app-wgtunnel.json b/immortalwrt-patches/feeds/luci/applications/luci-app-wgtunnel/root/usr/share/rpcd/acl.d/luci-app-wgtunnel.json new file mode 100644 index 0000000..5c5ea5d --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-wgtunnel/root/usr/share/rpcd/acl.d/luci-app-wgtunnel.json @@ -0,0 +1,15 @@ +{ + "luci-app-wgtunnel": { + "description": "Manage only the TR3000 wg0 office tunnel through luci.wgtunnel", + "read": { + "ubus": { + "luci.wgtunnel": [ "get", "status" ] + } + }, + "write": { + "ubus": { + "luci.wgtunnel": [ "prepare", "apply", "rollback", "reconnect" ] + } + } + } +} diff --git a/immortalwrt-patches/feeds/luci/applications/luci-app-wgtunnel/root/usr/share/rpcd/ucode/luci.wgtunnel b/immortalwrt-patches/feeds/luci/applications/luci-app-wgtunnel/root/usr/share/rpcd/ucode/luci.wgtunnel new file mode 100644 index 0000000..7ae45a8 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/applications/luci-app-wgtunnel/root/usr/share/rpcd/ucode/luci.wgtunnel @@ -0,0 +1,367 @@ +#!/usr/bin/ucode +/* SPDX-License-Identifier: GPL-3.0-only */ +'use strict'; + +import { access, chmod, mkdir, popen, readfile, stat, unlink, writefile } from 'fs'; +import { cursor } from 'uci'; + +const IFACE = 'wg0'; +const PEER = 'wgpeer'; +const STATE_DIR = '/tmp/luci-wgtunnel'; +const TOKEN_FILE = STATE_DIR + '/prepare.json'; +const SNAPSHOT = STATE_DIR + '/network.backup'; +const LOCK = STATE_DIR + '/apply.lock'; +const REQUIRED_ADDRESS = '10.99.0.2/32'; +const REQUIRED_ALLOWED = '10.99.0.1/32'; + +let uci = null; + +function sh(command) { + let fd = popen(command, 'r'); + if (!fd) + return { ok: false, out: '' }; + let out = fd.read('all') || ''; + return { ok: fd.close() == 0, out }; +} + +function read_text(path) { + let value = readfile(path); + return value == null ? null : trim(value); +} + +function uptime() { + let value = read_text('/proc/uptime') || '0'; + return +split(value, /\s+/)[0]; +} + +function ensure_state_dir() { + mkdir(STATE_DIR, 0700); + chmod(STATE_DIR, 0700); +} + +function fail(code, message) { + return { ok: false, code, message: message || code }; +} + +function arr(value) { + if (value == null) + return []; + return type(value) == 'array' ? value : [ value ]; +} + +function uniq(values) { + let result = []; + for (let value in arr(values)) { + value = trim(`${value}`); + if (value != '' && index(result, value) < 0) + push(result, value); + } + return result; +} + +function clean_scalar(value) { + value = trim(`${value || ''}`); + return match(value, /[\x00-\x1f\x7f]/) ? null : value; +} + +function ip4_to_int(ip) { + let parts = split(ip, '.'); + if (length(parts) != 4) + return null; + let n = 0; + for (let part in parts) { + if (!match(part, /^[0-9]+$/)) + return null; + let v = +part; + if (v < 0 || v > 255) + return null; + n = n * 256 + v; + } + return n; +} + +function parse_cidr(value) { + value = clean_scalar(value); + if (value == null) + return null; + let m = match(value, /^([0-9]{1,3}(?:\.[0-9]{1,3}){3})\/([0-9]|[12][0-9]|3[0-2])$/); + if (!m) + return null; + let ip = ip4_to_int(m[1]); + let prefix = +m[2]; + if (ip == null) + return null; + return { text: `${m[1]}/${prefix}`, ip, prefix }; +} + +function reject_bad_cidr(value, field) { + let cidr = parse_cidr(value); + if (cidr == null) + return fail('INVALID_CIDR', `${field}: ${value}`); + if (cidr.ip == 0 || cidr.prefix == 0) + return fail('DEFAULT_ROUTE_REJECTED', field); + let first = floor(cidr.ip / 16777216); + if (first >= 224 || first == 127 || first == 169) + return fail('RESERVED_RANGE_REJECTED', field); + let ip = cidr.text; + if (match(ip, /^192\.168\./) || match(ip, /^10\.(?!99\.)/) || match(ip, /^172\.(1[6-9]|2[0-9]|3[0-1])\./)) + return fail('LAN_WAN_OVERLAP_REJECTED', field); + return null; +} + +function validate_cidr_list(values, required, field) { + values = uniq(values); + if (index(values, required) < 0) + push(values, required); + for (let value in values) { + let err = reject_bad_cidr(value, field); + if (err) + return err; + } + return { ok: true, values }; +} + +function valid_port(value) { + value = clean_scalar(value); + return value != null && match(value, /^[0-9]+$/) && +value > 0 && +value <= 65535; +} + +function valid_host(value) { + value = clean_scalar(value); + return value != null && value != '' && length(value) <= 253 && match(value, /^[A-Za-z0-9_.:-]+$/) && !match(value, /^-/) && !match(value, /\.\./); +} + +function valid_wg_key(value) { + value = clean_scalar(value); + if (value == null || value == '') + return true; + if (!match(value, /^[A-Za-z0-9+/]{43}=$/)) + return false; + let decoded = b64dec(value); + return decoded != null && length(decoded) == 32 && b64enc(decoded) == value; +} + +function section_exists(name, type_name) { + return uci.get('network', name) != null && (type_name == null || uci.get('network', name, '.type') == type_name); +} + +function generation() { + let s = stat('/etc/config/network'); + return s == null ? 'missing' : `${s.mtime || 0}:${s.size || 0}`; +} + +function read_config() { + let addresses = uniq(uci.get('network', IFACE, 'addresses')); + let allowed = uniq(uci.get('network', PEER, 'allowed_ips')); + return { + interface: IFACE, + peer_section: PEER, + addresses, + private_key_configured: !!uci.get('network', IFACE, 'private_key'), + endpoint_host: uci.get('network', PEER, 'endpoint_host') || '', + endpoint_port: uci.get('network', PEER, 'endpoint_port') || '', + public_key_configured: !!uci.get('network', PEER, 'public_key'), + preshared_key_configured: !!uci.get('network', PEER, 'preshared_key'), + allowed_ips: allowed, + required_address: REQUIRED_ADDRESS, + required_allowed_ip: REQUIRED_ALLOWED, + generation: generation() + }; +} + +function normalize_input(input) { + input ||= {}; + let addresses = validate_cidr_list(input.addresses, REQUIRED_ADDRESS, 'addresses'); + if (!addresses.ok) + return addresses; + let allowed = validate_cidr_list(input.allowed_ips, REQUIRED_ALLOWED, 'allowed_ips'); + if (!allowed.ok) + return allowed; + let endpoint_host = clean_scalar(input.endpoint_host); + let endpoint_port = clean_scalar(input.endpoint_port); + if (!valid_host(endpoint_host)) + return fail('INVALID_ENDPOINT_HOST'); + if (!valid_port(endpoint_port)) + return fail('INVALID_ENDPOINT_PORT'); + for (let name in [ 'private_key', 'public_key', 'preshared_key' ]) + if (!valid_wg_key(input[name])) + return fail('INVALID_WG_KEY', name); + return { ok: true, values: { + addresses: addresses.values, + endpoint_host, + endpoint_port, + allowed_ips: allowed.values, + private_key: clean_scalar(input.private_key) || null, + public_key: clean_scalar(input.public_key) || null, + preshared_key: clean_scalar(input.preshared_key) || null + } }; +} + +function diff_values(current, next) { + let diff = []; + function add(field, before, after, secret) { + if (json(before) != json(after)) + push(diff, { field, before: secret ? (before ? '' : '') : before, after: secret ? (after ? '' : '') : after, secret: !!secret }); + } + add('network.wg0.addresses', current.addresses, next.addresses, false); + add('network.wgpeer.endpoint_host', current.endpoint_host, next.endpoint_host, false); + add('network.wgpeer.endpoint_port', current.endpoint_port, next.endpoint_port, false); + add('network.wgpeer.allowed_ips', current.allowed_ips, next.allowed_ips, false); + add('network.wg0.private_key', current.private_key_configured, next.private_key != null, true); + add('network.wgpeer.public_key', current.public_key_configured, next.public_key != null, true); + add('network.wgpeer.preshared_key', current.preshared_key_configured, next.preshared_key != null, true); + return diff; +} + +function write_token(state) { + ensure_state_dir(); + writefile(TOKEN_FILE, json(state)); + chmod(TOKEN_FILE, 0600); +} + +function read_token() { + let text = read_text(TOKEN_FILE); + return text == null ? null : json(text); +} + +function delete_token() { + unlink(TOKEN_FILE); +} + +function set_list(section, option, values) { + uci.delete('network', section, option); + for (let value in values) + uci.add_list('network', section, option, value); +} + +function apply_values(values) { + set_list(IFACE, 'addresses', values.addresses); + uci.set('network', PEER, 'endpoint_host', values.endpoint_host); + uci.set('network', PEER, 'endpoint_port', values.endpoint_port); + set_list(PEER, 'allowed_ips', values.allowed_ips); + if (values.private_key != null) + uci.set('network', IFACE, 'private_key', values.private_key); + if (values.public_key != null) + uci.set('network', PEER, 'public_key', values.public_key); + if (values.preshared_key != null) + uci.set('network', PEER, 'preshared_key', values.preshared_key); + uci.commit('network'); +} + +function snapshot() { + ensure_state_dir(); + let copied = sh(`cp /etc/config/network '${SNAPSHOT}' && chmod 0600 '${SNAPSHOT}'`); + return copied.ok; +} + +function restore_snapshot() { + if (!access(SNAPSHOT)) + return false; + let restored = sh(`cp '${SNAPSHOT}' /etc/config/network && chmod 0600 /etc/config/network`); + return restored.ok; +} + +function reconnect_wg0() { + return sh('/sbin/ifdown wg0 >/dev/null 2>&1; /sbin/ifup wg0 >/dev/null 2>&1').ok; +} + +function check_runtime() { + let link = sh('/usr/sbin/ip link show dev wg0 >/dev/null 2>&1'); + let route = sh('/usr/sbin/ip route show 10.99.0.1/32 2>/dev/null'); + let vxlan = sh('/usr/sbin/ip -d link show dev vxlan0 2>/dev/null'); + let ok_route = route.ok && index(route.out, 'dev wg0') >= 0; + let ok_vxlan = vxlan.ok && index(vxlan.out, 'vxlan id 10') >= 0 && index(vxlan.out, 'dstport 4789') >= 0 && index(vxlan.out, 'nolearning') >= 0 && index(vxlan.out, 'master br-lan') >= 0; + return { wg0: link.ok, route: ok_route, vxlan: ok_vxlan, ok: link.ok && ok_route && ok_vxlan }; +} + +function status() { + let hs = sh('/usr/bin/wg show wg0 latest-handshakes 2>/dev/null'); + let latest = null, peers = 0; + if (hs.ok) { + for (let line in split(trim(hs.out), /\n/)) { + let fields = split(line, /\t/); + if (length(fields) >= 2) { + peers++; + let t = +fields[1]; + if (t > (latest || 0)) + latest = t; + } + } + } + let now = timelocal(localtime()); + let age = latest == null || latest == 0 ? null : max(0, now - latest); + let runtime = check_runtime(); + return { available: hs.ok, peers, handshake_age_seconds: age, runtime, state: !hs.ok ? 'unavailable' : (peers == 0 ? 'no_peer' : (age == null ? 'never_handshaken' : (age <= 180 ? 'healthy' : 'stale'))) }; +} + +const methods = { + get: { call: function() { + uci = cursor(); + return read_config(); + } }, + status: { call: function() { + return status(); + } }, + prepare: { call: function(input) { + uci = cursor(); + if (!section_exists(IFACE, 'interface') || !section_exists(PEER, 'wireguard_wg0')) + return fail('REQUIRED_SECTION_MISSING'); + let normalized = normalize_input(input || {}); + if (!normalized.ok) + return normalized; + let current = read_config(); + let diff = diff_values(current, normalized.values); + let token = trim(readfile('/proc/sys/kernel/random/uuid') || `${uptime()}`); + write_token({ token, expires: uptime() + 60, generation: current.generation, values: normalized.values }); + return { ok: true, token, expires_in: 60, diff, requires_confirm: true }; + } }, + apply: { call: function(input) { + uci = cursor(); + input ||= {}; + let state = read_token(); + if (state == null || input.token != state.token || input.confirm !== true) + return fail('INVALID_TOKEN'); + if (uptime() > state.expires) + return fail('TOKEN_EXPIRED'); + if (generation() != state.generation) + return fail('CONFIG_GENERATION_CHANGED'); + if (!sh(`mkdir '${LOCK}' 2>/dev/null`).ok) + return fail('APPLY_LOCKED'); + let runtime = null; + try { + delete_token(); + if (!snapshot()) { + sh(`rmdir '${LOCK}' 2>/dev/null`); + return fail('SNAPSHOT_FAILED'); + } + apply_values(state.values); + reconnect_wg0(); + runtime = check_runtime(); + if (!runtime.ok) { + restore_snapshot(); + reconnect_wg0(); + sh(`rmdir '${LOCK}' 2>/dev/null`); + return { ok: false, code: 'RUNTIME_CHECK_FAILED_ROLLED_BACK', runtime }; + } + sh(`rmdir '${LOCK}' 2>/dev/null`); + return { ok: true, runtime }; + } catch (e) { + restore_snapshot(); + reconnect_wg0(); + sh(`rmdir '${LOCK}' 2>/dev/null`); + return fail('APPLY_EXCEPTION_ROLLED_BACK'); + } + } }, + rollback: { call: function() { + let ok = restore_snapshot(); + if (ok) + reconnect_wg0(); + return { ok, runtime: check_runtime() }; + } }, + reconnect: { call: function() { + let ok = reconnect_wg0(); + return { ok, runtime: check_runtime() }; + } } +}; + +return { 'luci.wgtunnel': methods }; diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/Makefile b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/Makefile new file mode 100644 index 0000000..6af33f6 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/Makefile @@ -0,0 +1,24 @@ +# +# Copyright (C) 2008-2019 Jerrykuku +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=Argon Theme +LUCI_DEPENDS:=+wget +jsonfilter + +PKG_VERSION:=2.4.3 +PKG_RELEASE:=20250722 + +LUCI_MINIFY_CSS:=0 + +define Package/luci-theme-argon/conffiles +/etc/config/argon +/www/luci-static/argon/background/ +endef + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/background/README.md b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/background/README.md new file mode 100644 index 0000000..a86f27b --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/background/README.md @@ -0,0 +1,2 @@ +Drop background here! +accept jpg png gif mp4 webm diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/css/cascade.css b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/css/cascade.css new file mode 100644 index 0000000..75a69ae --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/css/cascade.css @@ -0,0 +1,4321 @@ +/** + * Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material and Argon Template + * + * luci-theme-argon + * Copyright 2025 Jerrykuku + * + * Have a bug? Please create an issue here on GitHub! + * https://github.com/jerrykuku/luci-theme-argon/issues + * + * luci-theme-material: + * Copyright 2015 Lutty Yang + * https://github.com/LuttyYang/luci-theme-material/ + * + * Agron Theme + * https://demos.creative-tim.com/argon-dashboard/index.html + * + * Login background + * https://unsplash.com/ + * Font generate by Icomoon + * + * Licensed to the public under the Apache License 2.0 + */ +:root { + --primary: #5e72e4; + --dark-primary: #483d8b; + --header-color: #fff; + --menu-bg-color: #ffffff; + --menu-color: #5f6368; + --main-menu-color: #202124; + --red: #f5365c; + --orange: #fb6340; + --yellow: #ffd600; + --green: #2dce89; + --teal: #11cdef; + --cyan: #2bffc6; + --gray: #8898aa; + --gray-dark: #32325d; + --light: #ced4da; + --lighter: #e9ecef; + --success: #2dce89; + --info: #11cdef; + --warning: #fb6340; + --danger: #f5365c; + --light: #adb5bd; + --dark: #212529; + --default: #172b4d; + --white: #fff; + --darker: black; + --background-color: #f4f5f7; + --login-form-bg-color: rgba(244, 245, 247, 0.8); + --blur-radius: 10px; + --blur-opacity: 0.5; + --blur-radius-dark: 10px; + --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=="); +} +/* + * Include base and custom css + */ +@font-face { + font-family: 'Google Sans'; + src: local('Google Sans'), local('GoogleSans-Regular'), url('../fonts/GoogleSans-Regular.woff2') format('woff2'), url('../fonts/GoogleSans-Regular.woff') format('woff'); + font-weight: normal; + font-style: normal; + font-display: swap; +} +/* Logo Font */ +@font-face { + font-family: 'TypoGraphica'; + src: local('TypoGraphica'), url('../fonts/TypoGraphica.woff2') format('woff2'), url('../fonts/TypoGraphica.woff') format('woff'); + font-weight: normal; + font-style: normal; + font-display: swap; +} +/* Icon Font */ +@font-face { + font-family: 'argon'; + src: url('../fonts/argon.woff2') format('woff2'), url('../fonts/argon.woff') format('woff'); + font-weight: normal; + font-style: normal; + font-display: swap; +} +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} +html { + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +html, +body { + margin: 0; + padding: 0; + height: 100%; + font-family: var(--font-family-sans-serif); +} +body { + background-color: var(--background-color); + color: var(--gray-dark); + -webkit-tap-highlight-color: transparent; + font-size: 0.875rem; +} +main { + display: block; +} +.h1, +.h2, +.h3, +.h4, +.h5, +.h6, +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: inherit; + font-weight: normal; + line-height: 1.1 !important; + color: inherit; +} +h1 { + font-size: 2rem; + margin: 0.67em 0; + padding-bottom: 0.5rem; + border-bottom: thin solid var(--lighter); +} +h2 { + padding: 1rem 1.25rem; + font-size: 1.25rem; + font-weight: bold; + color: var(--gray-dark); + border-radius: 0.25rem; + background: var(--white); + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.03); +} +h3 { + margin: 0; + padding: 0.8755rem 1.25rem; + font-size: 1.1rem; + font-weight: bold; + line-height: 1; + color: var(--gray-dark); + border-radius: 0.25rem; + background: var(--white); + display: block; + width: 100%; +} +h4 { + margin: 0; + padding: 0.75rem 1.25rem; + font-size: 0.875rem; + font-weight: bold; + color: var(--gray-dark-400); +} +h4 em { + padding: 0 0.5rem; +} +h5 { + margin: 2rem 0 0 0; + padding-bottom: 0.5rem; + font-size: 1rem; +} +a { + background-color: transparent; +} +abbr { + cursor: help; + text-decoration: underline; + color: var(--primary); +} +abbr[title] { + border-bottom: none; + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} +b, +strong { + font-weight: bolder; +} +code, +kbd, +samp { + font-family: inherit; + font-size: inherit; + padding: 1px 3px; + color: var(--dark); + border-radius: 0.5rem; + background: var(--lighter); +} +small { + font-size: 90%; + line-height: 1.42857143; + white-space: normal; +} +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sub { + bottom: -0.25em; +} +sup { + top: -0.5em; +} +hr { + box-sizing: content-box; + height: 0; + margin: 1rem 0; + overflow: visible; + opacity: 0.1; + border-color: var(--lighter); +} +pre { + font-family: monospace, monospace; + font-size: 1em; + overflow: auto; +} +img { + border-style: none; +} +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + font-size: 100%; + line-height: 1.15; + margin: 0; +} +button, +input { + overflow: visible; +} +button, +select { + text-transform: none; +} +[type=button], +[type=reset], +[type=submit], +button { + -webkit-appearance: button; + appearance: button; +} +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner, +button::-moz-focus-inner { + border-style: none; + padding: 0; +} +[type=button]:-moz-focusring, +[type=reset]:-moz-focusring, +[type=submit]:-moz-focusring, +button:-moz-focusring { + outline: 1px dotted ButtonText; +} +[type=checkbox], +[type=radio] { + box-sizing: border-box; + padding: 0; +} +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height: auto; +} +[type=search] { + -webkit-appearance: textfield; + appearance: textfield; + outline-offset: -2px; +} +[type=search]::-webkit-search-decoration { + -webkit-appearance: none; + appearance: none; +} +::-webkit-file-upload-button { + -webkit-appearance: button; + appearance: button; + font: inherit; +} +input[type="checkbox"] { + appearance: none !important; + -webkit-appearance: none !important; + border: 1px solid var(--primary); + width: 1rem !important; + height: 1rem !important; + padding: 0; + cursor: pointer; + transition: all 0.2s; +} +input[type="checkbox"]:checked { + border: 1px solid var(--primary); + background-image: url('data:image/svg+xml,%3csvg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 8 8\'%3e%3cpath fill=\'%23fff\' d=\'M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z\'/%3e%3c/svg%3e') !important; + background-color: var(--primary); + background-size: 70%; + background-repeat: no-repeat; + background-position: center; +} +select { + padding: 0.36rem 0.8rem; + color: var(--gray-dark); + border: thin solid var(--lighter); + background-color: var(--white); + background-image: none; +} +textarea { + padding: 0.25rem; + overflow: auto; +} +textarea:focus-visible { + outline: none; + border: 1px solid var(--primary); +} +fieldset { + padding: 0.35em 0.75em 0.625em; +} +legend { + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal; +} +details { + display: block; +} +summary { + display: list-item; +} +template { + display: none; +} +progress { + vertical-align: baseline; +} +ul { + line-height: normal; +} +li { + list-style-type: none; +} +[disabled="disabled"] { + pointer-events: none; +} +::selection { + background-color: var(--primary); + color: var(--white); +} +::placeholder { + color: var(--lighter); +} +a:link, +a:visited, +a:active { + color: var(--primary); + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.nowrap:not(.td) { + white-space: nowrap; +} +div[style="width:100%;height:300px;border:1px solid #000;background:#fff"] { + border: 0 !important; +} +/** +Pure v3.0.0 +Copyright 2013 Yahoo! +Licensed under the BSD License. +https://github.com/pure-css/pure/blob/master/LICENSE +*/ +/** +normalize.css v | MIT License | https://necolas.github.io/normalize.css/ +Copyright (c) Nicolas Gallagher and Jonathan Neal +*/ +/** normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ +.pure-g { + display: flex; + flex-flow: row wrap; + align-content: flex-start; +} +.pure-u { + display: inline-block; + vertical-align: top; +} +.pure-u-1, +.pure-u-1-1, +.pure-u-1-12, +.pure-u-1-2, +.pure-u-1-24, +.pure-u-1-3, +.pure-u-1-4, +.pure-u-1-5, +.pure-u-1-6, +.pure-u-1-8, +.pure-u-10-24, +.pure-u-11-12, +.pure-u-11-24, +.pure-u-12-24, +.pure-u-13-24, +.pure-u-14-24, +.pure-u-15-24, +.pure-u-16-24, +.pure-u-17-24, +.pure-u-18-24, +.pure-u-19-24, +.pure-u-2-24, +.pure-u-2-3, +.pure-u-2-5, +.pure-u-20-24, +.pure-u-21-24, +.pure-u-22-24, +.pure-u-23-24, +.pure-u-24-24, +.pure-u-3-24, +.pure-u-3-4, +.pure-u-3-5, +.pure-u-3-8, +.pure-u-4-24, +.pure-u-4-5, +.pure-u-5-12, +.pure-u-5-24, +.pure-u-5-5, +.pure-u-5-6, +.pure-u-5-8, +.pure-u-6-24, +.pure-u-7-12, +.pure-u-7-24, +.pure-u-7-8, +.pure-u-8-24, +.pure-u-9-24 { + display: inline-block; + letter-spacing: normal; + word-spacing: normal; + vertical-align: top; + text-rendering: auto; +} +.pure-u-1-24 { + width: 4.1667%; +} +.pure-u-1-12, +.pure-u-2-24 { + width: 8.3333%; +} +.pure-u-1-8, +.pure-u-3-24 { + width: 12.5%; +} +.pure-u-1-6, +.pure-u-4-24 { + width: 16.6667%; +} +.pure-u-1-5 { + width: 20%; +} +.pure-u-5-24 { + width: 20.8333%; +} +.pure-u-1-4, +.pure-u-6-24 { + width: 25%; +} +.pure-u-7-24 { + width: 29.1667%; +} +.pure-u-1-3, +.pure-u-8-24 { + width: 33.3333%; +} +.pure-u-3-8, +.pure-u-9-24 { + width: 37.5%; +} +.pure-u-2-5 { + width: 40%; +} +.pure-u-10-24, +.pure-u-5-12 { + width: 41.6667%; +} +.pure-u-11-24 { + width: 45.8333%; +} +.pure-u-1-2, +.pure-u-12-24 { + width: 50%; +} +.pure-u-13-24 { + width: 54.1667%; +} +.pure-u-14-24, +.pure-u-7-12 { + width: 58.3333%; +} +.pure-u-3-5 { + width: 60%; +} +.pure-u-15-24, +.pure-u-5-8 { + width: 62.5%; +} +.pure-u-16-24, +.pure-u-2-3 { + width: 66.6667%; +} +.pure-u-17-24 { + width: 70.8333%; +} +.pure-u-18-24, +.pure-u-3-4 { + width: 75%; +} +.pure-u-19-24 { + width: 79.1667%; +} +.pure-u-4-5 { + width: 80%; +} +.pure-u-20-24, +.pure-u-5-6 { + width: 83.3333%; +} +.pure-u-21-24, +.pure-u-7-8 { + width: 87.5%; +} +.pure-u-11-12, +.pure-u-22-24 { + width: 91.6667%; +} +.pure-u-23-24 { + width: 95.8333%; +} +.pure-u-1, +.pure-u-1-1, +.pure-u-24-24, +.pure-u-5-5 { + width: 100%; +} +.col-1 { + flex: 1 1 30px !important; +} +.col-2 { + flex: 2 2 60px !important; +} +.col-3 { + flex: 3 3 90px !important; +} +.col-4 { + flex: 4 4 120px !important; +} +.col-5 { + flex: 5 5 150px !important; +} +.col-6 { + flex: 6 6 180px !important; +} +.col-7 { + flex: 7 7 210px !important; +} +.col-8 { + flex: 8 8 240px !important; +} +.col-9 { + flex: 9 9 270px !important; +} +.col-10 { + flex: 10 10 300px !important; +} +.table { + position: relative; + display: table; +} +.tr { + display: table-row; +} +.thead { + display: table-header-group; +} +.tbody { + display: table-row-group; +} +.tfoot { + display: table-footer-group; +} +.td, +.th { + line-height: normal; + display: table-cell; + padding: 0.5em; + text-align: center; + vertical-align: middle; +} +.th { + font-weight: bold; + white-space: nowrap; +} +.tr.placeholder { + height: 4em; +} +.tr.placeholder > .td { + line-height: 3; + position: absolute; + right: 0; + bottom: 0; + left: 0; + padding: 0.4rem 0 !important; + text-align: center !important; + background: inherit; +} +.td[width="33%"] { + padding: 1.1em 1.5rem; +} +.table[width="33%"], +.th[width="33%"], +.td[width="33%"] { + width: 33%; +} +.table[width="100%"], +.th[width="100%"], +.td[width="100%"] { + width: 100%; +} +.btn, +button, +select, +input, +.cbi-dropdown { + line-height: 1.5rem; + height: 2.5rem; + padding: 0.5rem 0.75rem; + color: #8898aa; + border: 1px solid #dee2e6; + border-radius: 0.25rem; + outline: 0; + background-image: none; + box-shadow: none; + transition: box-shadow 0.15s ease; +} +select { + padding-right: 1.5rem; + background-image: url("data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBmaWxsPSIjODg5OGFhIiBkPSJNNS4yOTMgOS4yOTNhMSAxIDAgMCAxIDEuNDE0IDBMMTIgMTQuNTg2bDUuMjkzLTUuMjkzYTEgMSAwIDEgMSAxLjQxNCAxLjQxNGwtNiA2YTEgMSAwIDAgMS0xLjQxNCAwbC02LTZhMSAxIDAgMCAxIDAtMS40MTQiLz48L3N2Zz4="); + background-size: 1rem; + background-position: right 0.5rem center; + background-repeat: no-repeat; + appearance: none; +} +select:not([multiple="multiple"]):focus, +input:not(.cbi-button):focus, +.cbi-dropdown:focus { + border-color: var(--primary); + box-shadow: 0 3px 9px rgba(50, 50, 9, 0), 3px 4px 8px rgba(94, 114, 228, 0.1); +} +.cbi-dropdown, +select[multiple="multiple"] { + height: auto; +} +.login-page { + display: flex; + height: 100%; + flex-direction: column; +} +.login-page .video { + position: absolute; + top: 0; + left: 0; + height: 100vh; + width: 100vw; + display: flex; + align-items: center; + justify-content: center; + background-color: var(--darker); + overflow: hidden; +} +.login-page .video video { + width: 100%; + height: auto; +} +.login-page .volume-control { + position: fixed; + top: 1rem; + right: 1rem; + width: 1.5rem; + height: 1.5rem; + z-index: 5000; + cursor: pointer; + background: url(../img/volume_high.svg) no-repeat center / contain; +} +.login-page .volume-control.mute { + background-image: url(../img/volume_off.svg); +} +.login-page .main-bg { + position: absolute; + top: 0; + left: 0; + height: 100vh; + width: 100vw; + background: url(../img/blank.png) no-repeat center / cover; + transition: all 0.5s ease; +} +.login-page .login-container { + z-index: 10; + margin-left: 5%; + display: flex; + height: 100vh; + width: 26rem; + flex-direction: column; + background-color: var(--white); + backdrop-filter: blur(var(--blur-radius)); + background-color: rgba(244, 245, 247, var(--blur-opacity)); + box-shadow: rgba(0, 0, 0, 0.75) 0 0 35px -5px; +} +.login-page .login-container .login-form { + position: absolute; + top: 0; + left: 0; + height: 100vh; + width: 100vw; + display: flex; + flex-direction: column; + align-items: center; + max-width: 26rem; +} +.login-page .login-container .login-form .brand { + display: flex; + align-items: center; + justify-content: center; + margin: 50px auto 100px 50px; + color: var(--default); + text-decoration: none; +} +.login-page .login-container .login-form .brand .icon { + width: 50px; + height: auto; + margin-right: 25px; +} +.login-page .login-container .login-form .brand .brand-text { + margin-right: 45px; + font-size: 1.25rem; + font-weight: 700; + font-family: "TypoGraphica"; + word-break: break-word; +} +.login-page .login-container .login-form .brand:hover { + text-decoration: none; +} +.login-page .login-container .login-form .form-login { + width: 100%; + padding: 20px 50px; + box-sizing: border-box; +} +.login-page .login-container .login-form .form-login .errorbox { + padding-bottom: 2rem; + text-align: center; + color: var(--warning); +} +.login-page .login-container .login-form .form-login .input-group { + position: relative; + margin-bottom: 1.25rem; +} +.login-page .login-container .login-form .form-login .input-group::before { + font-family: 'argon' !important; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + position: absolute; + top: 10px; + left: 10px; + z-index: 100; + font-size: 1.5rem; + color: var(--default); +} +.login-page .login-container .login-form .form-login .input-group .border { + position: absolute; + bottom: 0; + width: 100%; + height: 1px; + border-bottom: 1px solid var(--primary); + transform: scaleX(0); + transition: transform 0.3s ease; +} +.login-page .login-container .login-form .form-login .input-group input { + display: block; + width: 100%; + margin: 0.825rem 0; + padding: 0.5rem 0.75rem 0.5rem 3rem; + font-size: 1rem; + line-height: 1.5em; + color: var(--default); + background-color: transparent; + background-clip: padding-box; + border: 0; + border-bottom: 1px solid var(--white); + border-radius: 0; + outline: none; + box-sizing: border-box; + box-shadow: 0 3px 2px rgba(233, 236, 239, 0.05); + transition: all 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55); +} +.login-page .login-container .login-form .form-login .input-group input:focus + .border { + transform: scaleX(1); +} +.login-page .login-container .login-form .form-login .input-group .cbi-input-password { + position: relative; + margin-bottom: 2rem; +} +.login-page .login-container .login-form .form-login .input-group.user-icon::before { + content: "\e971"; +} +.login-page .login-container .login-form .form-login .input-group.pass-icon::before { + content: "\e910"; +} +.login-page .login-container .login-form .cbi-button-apply { + width: 100% !important; + min-height: 50px; + margin: 30px 0 100px; + padding: 10px 0; + font-size: 15px; + font-weight: 600; + color: var(--white); + text-align: center; + letter-spacing: 0.8rem; + background-color: var(--primary) !important; + border: none; + border-radius: 6px; + outline: none; + cursor: pointer; + box-shadow: rgba(0, 0, 0, 0.1) 0 0 50px 0; + transition: all 0.3s ease !important; +} +.login-page .login-container .login-form .cbi-button-apply:hover, +.login-page .login-container .login-form .cbi-button-apply:focus { + opacity: 0.9; +} +.login-page .login-container footer { + position: absolute; + bottom: 0; + z-index: 10; + display: flex; + justify-content: space-evenly; + width: 100%; + margin-top: auto; + padding: 0 0 30px; + color: var(--gray); + text-align: center; + line-height: 1.6rem; + font-size: 0.75rem; +} +.login-page .login-container footer .ftc { + position: absolute; + bottom: 30px; + width: 100%; +} +.login-page .login-container footer .luci-link { + display: block; +} +.main { + position: relative; + width: 100%; + height: 100%; + overflow-y: auto; + display: flex; + flex-direction: row; +} +.main-left { + width: 15rem; + height: 100%; + flex-shrink: 0; + z-index: 100; + overflow-x: auto; + word-break: break-word; + background-color: var(--menu-bg-color); + box-shadow: rgba(0, 0, 0, 0.75) 0px 0px 15px -5px; + transition: all 0.2s; +} +.main-left .sidenav-header { + padding: 1.5rem 0.5rem; + text-align: center; +} +.main-left .sidenav-header .brand { + display: block; + margin: 0 2rem; + font-size: 1.8rem; + font-family: "TypoGraphica"; + color: var(--primary); + text-decoration: none; + text-align: center; + cursor: default; +} +.main-left .sidenav-header .brand .logo { + max-width: 100%; + height: auto; +} +.main-left .nav { + margin-top: 0.5rem; +} +.main-left .nav > li > a:first-child { + display: block; + position: relative; + margin: 0.1rem 0.5rem; + padding: 0.675rem 0 0.675rem 2.5rem; + font-size: 1rem; + text-decoration: none; + border-radius: 0.25rem; + cursor: default; + transition: all 0.2s; +} +.main-left .nav > li > a:first-child.active { + color: #fff; + background: var(--primary); +} +.main-left .nav > li > a:first-child.active::before { + color: #fff !important; +} +.main-left .nav > li > a:first-child.active::after { + transform: rotate(90deg); + color: #fff !important; +} +.main-left .nav > li > a:first-child:hover { + cursor: pointer; + color: #fff; + background: var(--primary); +} +.main-left .nav > li > a:first-child:hover::before { + color: #fff !important; +} +.main-left .nav > li > a:first-child::before { + position: absolute; + left: 0.8rem; + padding-top: 3px; + font-family: 'argon' !important; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + content: "\e915"; + color: var(--primary); + transition: all 0.3s; +} +.main-left .nav > .slide > .menu::before { + transition: transform 0.1s ease-in-out; +} +.main-left .nav > .slide > .menu.active::before { + transition: transform 0.2s ease-in-out; +} +.main-left .nav li { + padding: 0; + cursor: pointer; + user-select: none; +} +.main-left .nav li a { + display: block; + color: var(--menu-color); +} +.main-left .nav li.slide { + padding: 0; +} +.main-left .nav li.slide ul { + display: none; + overflow: hidden; +} +.main-left .nav li.slide:hover { + background: none; +} +.main-left .nav li.slide .slide-menu { + margin: 0 0.5rem 0 2.5rem; + padding: 0rem 0.5rem; +} +.main-left .nav li.slide .slide-menu.active { + display: block; +} +.main-left .nav li.slide .slide-menu li { + position: relative; + margin: 0; + border-radius: 0.25rem; + background: none; + list-style: none; +} +.main-left .nav li.slide .slide-menu li a { + padding: 0.5rem 0rem; + text-decoration: none; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.main-left .nav li.slide .slide-menu li::after { + position: absolute; + left: 0; + bottom: 0; + width: 0; + height: 2px; + content: ""; + background-color: var(--primary); + transition: all 0.2s; +} +.main-left .nav li.slide .slide-menu li:hover { + background: none; +} +.main-left .nav li.slide .slide-menu li:hover::after { + width: 100%; +} +.main-left .nav li.slide .slide-menu .active { + background: none; + color: var(--menu-color); +} +.main-left .nav li.slide .slide-menu .active a { + color: var(--menu-color); +} +.main-left .nav li.slide .slide-menu .active::after { + position: absolute; + left: 0; + bottom: 0; + width: 100%; + height: 2px; + content: ""; + background-color: var(--primary); + transition: all 0.2s; +} +.main-left .nav li.slide .slide-menu .active:hover { + background: none; +} +.main-left .nav li.slide .slide-menu .active:hover::after { + width: 100%; +} +.main-left .nav li .menu { + display: block; + position: relative; + margin: 0.1rem 0.5rem; + padding: 0.675rem 0 0.675rem 2.5rem; + font-size: 1rem; + text-decoration: none; + border-radius: 0.25rem; + cursor: default; + transition: all 0.2s; +} +.main-left .nav li .menu.active { + color: #fff; + background: var(--primary); +} +.main-left .nav li .menu.active::before { + color: #fff !important; +} +.main-left .nav li .menu.active::after { + transform: rotate(90deg); + color: #fff !important; +} +.main-left .nav li .menu:hover { + cursor: pointer; + color: #fff; + background: var(--primary); +} +.main-left .nav li .menu:hover::before { + color: #fff !important; +} +.main-left .nav li .menu::before { + position: absolute; + left: 0.8rem; + padding-top: 3px; + font-family: 'argon' !important; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + content: "\e915"; + color: var(--primary); + transition: all 0.3s; +} +.main-left .nav li .menu::after { + position: absolute; + right: 0.5rem; + top: 0.8rem; + font-family: 'argon' !important; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + content: '\e90f'; + color: #ced4da; + text-rendering: auto; + transition: all 0.3s; +} +.main-left .nav li .menu[data-title="Status"]:before { + content: "\e906"; + color: var(--primary); +} +.main-left .nav li .menu[data-title="System"]:before { + content: "\e90a"; + color: #fb6340; +} +.main-left .nav li .menu[data-title="Services"]:before { + content: "\e909"; + color: #11cdef; +} +.main-left .nav li .menu[data-title="NAS"]:before { + content: "\e90c"; + color: #f3a4b5; +} +.main-left .nav li .menu[data-title="VPN"]:before { + content: "\e90b"; + color: #8965e0; +} +.main-left .nav li .menu[data-title="Network"]:before { + content: "\e908"; + color: #8965e0; +} +.main-left .nav li .menu[data-title="Bandwidth_Monitor"]:before { + content: "\e90d"; + color: #2dce89; +} +.main-left .nav li .menu[data-title="Docker"]:before { + content: "\e911"; + color: #6699ff; +} +.main-left .nav li .menu[data-title="Statistics"]:before { + content: "\e913"; + color: #8965e0; +} +.main-left .nav li .menu[data-title="Control"]:before { + content: "\e912"; + color: var(--primary); +} +.main-left .nav li .menu[data-title="Asterisk"]:before { + content: "\e914"; + color: #fb6340; +} +.main-left .nav li a[data-title="Log_out"]::before, +.main-left .nav li .food[data-title="Log_out"]::before { + content: "\e907"; + color: #adb5bd; +} +.main-left[style*="overflow: hidden"] > .nav > .slide > .menu::before { + display: none; +} +.main-left::-webkit-scrollbar { + width: 5px; + height: 1px; +} +.main-left::-webkit-scrollbar-thumb { + background-color: #f6f9fc; +} +.main-left::-webkit-scrollbar-track { + background-color: #fff; +} +.main-right { + height: 100%; + flex-grow: 1; + overflow-x: hidden; + overflow-y: auto; + display: flex; + flex-direction: column; + transition: all 0.2s; +} +.main-right > #maincontent { + position: relative; + z-index: 50; + flex: 1; + display: flex; + flex-direction: column; +} +.main-right > #maincontent > .container { + margin: 0 1.25rem 1rem 1.25rem; + flex-grow: 1; + display: flex; + flex-direction: column; + gap: 1rem; +} +.main-right > #maincontent .Dashboard { + color: var(--gray-dark) !important; +} +.main-right > #maincontent .Dashboard h3 { + color: var(--gray-dark); +} +.main-right > #maincontent .Dashboard p { + margin-top: 3px; + margin-bottom: 3px; +} +.main-right > #maincontent .Dashboard hr { + border-top: 1px solid #000000; +} +.main-right > #maincontent .Dashboard .dashboard-bg { + background-color: #fff; +} +.main-right > #maincontent .Dashboard .settings-info { + padding-top: 1em; + padding-bottom: 1em; +} +.main-right > #maincontent .Dashboard .settings-info p span:nth-child(2) { + max-height: 18.5px; + top: 4px; +} +.main-right > #maincontent .Dashboard .settings-info .label { + font-size: 0.7rem; + padding: 0.2rem 0.6rem; +} +header { + position: relative; + width: 100%; + padding: 0; + color: var(--header-color); +} +header.bg-primary { + background-color: var(--primary) !important; +} +header::after { + content: ""; + position: absolute; + width: 100%; + height: 2rem; + background-color: var(--primary) !important; +} +header .fill { + padding: 0.8rem 0; + display: flex; + border-bottom: 0px solid rgba(255, 255, 255, 0.08) !important; +} +header .fill .container { + width: 100%; + height: 2rem; + padding: 0 1.25rem; + display: flex; + align-items: center; +} +header .fill .container .flex1 { + flex: 1; +} +header .fill .container .flex1 .showSide { + display: none; + font-size: 1.4rem; + color: #fff; +} +header .fill .container .flex1 .showSide:hover { + text-decoration: none; +} +header .fill .container .flex1 .brand { + display: none; + padding-left: 1rem; + font-size: 1.5rem; + font-family: "TypoGraphica"; + color: #fff; + text-decoration: none; + cursor: default; + vertical-align: text-bottom; +} +header .fill .container .pull-right { + margin-top: 0rem; + float: right; + display: flex; +} +header .fill .status span { + display: inline-block; + margin: 0 0.25rem; + padding: 0.3rem 0.8rem; + font-size: 0.875rem; + font-weight: bold; + white-space: nowrap; + text-decoration: none; + text-transform: uppercase; + text-shadow: none; + border-radius: 4px; + cursor: pointer; + transition: all 0.3s; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 2px 0 rgba(0, 0, 0, 0.12); +} +header .fill .status span:last-child { + margin-right: 0; +} +header .fill .status span[data-indicator="poll-status"] { + color: #fff; +} +header .fill .status span[data-style="active"] { + background-color: var(--green); +} +header .fill .status span[data-style="inactive"] { + color: #ffffff !important; + background-color: #32325d; +} +footer { + padding: 1rem; + font-size: 0.875rem; + color: #aaa; + text-align: right; + white-space: nowrap; + overflow: hidden; +} +footer > a { + color: #aaa; + text-decoration: none; +} +#view { + border-radius: 0.25rem; + display: flex; + flex-direction: column; + gap: 1rem; +} +#view > .spinning { + position: fixed; + top: 50%; + left: 50%; + transform: translateX(-50%) translateY(-50%); + padding: 1rem; + border-radius: 0.5rem; + background: #ffffff; + box-shadow: 0 0 1rem 0 rgba(136, 152, 170, 0.15); +} +#view > div:first-child { + display: flex; + flex-direction: column; + gap: 0.875rem; +} +#xhr_poll_status { + display: flex; + margin-left: 0.5rem; +} +#xhr_poll_status * { + color: #fff; +} +.danger { + background-color: var(--danger) !important; +} +.warning { + background-color: var(--warning) !important; +} +.success { + background-color: var(--success) !important; +} +.notice { + background-color: var(--info) !important; + color: #fff; +} +.error { + color: var(--danger); +} +.alert, +.alert-message { + position: fixed; + width: 20rem; + z-index: 9000; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + font-weight: bold; + padding: 1rem 1.25rem; + border: 0; + border-radius: 0.25rem !important; + background-color: #fff; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 2px 0 rgba(0, 0, 0, 0.12); + text-shadow: none; +} +.alert.error, +.alert-message.error { + background-color: var(--warning); +} +.alert h4, +.alert-message h4 { + padding: 0.25rem 0rem; + border-radius: 0.25rem; +} +.alert .btn, +.alert-message .btn { + height: auto; +} +.modal.alert-message { + position: static; + width: 90%; + min-width: 270px; + max-width: 600px; + left: auto; + top: auto; + transform: none; + margin: 5em auto; +} +.alert-message > h4 { + font-size: 110%; + font-weight: bold; +} +.alert-message > * { + margin: 0.5rem 0; +} +.alert-message .btn { + padding: 0.3rem 0.6rem; +} +.container .alert, +.container .alert-message { + margin-left: 0; + margin-right: 0; + margin-top: 0rem; + position: relative; + top: 0; + transform: translate(-50%, 0); + width: 100%; +} +#mwan3-service-status > .alert-message { + left: 0.5rem; + transform: none; +} +.lg { + margin: 0; + padding: 0 !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 { + font-family: inherit; + font-weight: normal; + font-style: normal; + line-height: normal; + min-width: inherit; + padding: 0; + border: 0; + border-radius: 0.25rem; + background-color: #fff; + box-shadow: 0 0 1rem 0 rgba(136, 152, 170, 0.15); +} +.cbi-section:last-child, +.cbi-section-error:last-child, +#iptables:last-child, +.Firewall form:last-child, +#cbi-network > .cbi-section-node:last-child, +#cbi-wireless > .cbi-section-node:last-child, +#cbi-wireless > #wifi_assoclist_table:last-child, +[data-tab-title]:last-child, +[data-page^="admin-system-admin"]:not(.node-main-login) .cbi-map:not(#cbi-dropbear):last-child, +[data-page="admin-system-opkg"] #maincontent > .container:last-child { + margin: 0; + border: 0; +} +.cbi-modal .cbi-section, +.cbi-section .cbi-section { + padding: 0; + box-shadow: none; +} +.cbi-modal .cbi-tabmenu { + margin-left: 0; +} +.cbi-map { + display: flex; + flex-direction: column; + gap: 1rem; +} +.cbi-map > .cbi-tabmenu + div { + margin-top: -0.4375rem; +} +.cbi-map-descr { + font-size: small; + line-height: 1.5; + padding: 0 1.25rem; +} +.cbi-section > .cbi-section-descr { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} +.cbi-section > .cbi-section-descr:empty { + display: none; +} +.cbi-section-descr:not(:empty) { + font-size: small; + line-height: 1.5; + padding: 0rem 1rem; +} +.cbi-section-descr:empty { + display: none !important; +} +.cbi-map-descr + fieldset { + margin-top: 1rem; +} +.cbi-map-descr > abbr { + cursor: help; + text-decoration: underline; +} +.cbi-section > legend { + display: none !important; +} +fieldset > fieldset, +.cbi-section > .cbi-section { + margin: 0; + padding: 0; + border: 0; + box-shadow: none; +} +.cbi-section > h3:first-child, +.panel-title { + font-size: 1.1rem; + line-height: 1; + display: block; + width: 100%; + margin: 0; + margin-bottom: 0; + padding: 0.8755rem 1.25rem; + color: #32325d; + color: var(--gray-dark); +} +.cbi-section > h3:first-child, +.cbi-section > h4:first-child, +.cbi-section > p:first-child, +[data-tab-title] > h3:first-child, +[data-tab-title] > h4:first-child, +[data-tab-title] > p:first-child { + padding: 1rem 1.25rem; +} +.cbi-section p { + padding: 1rem; +} +.cbi-tblsection { + overflow-x: auto; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +table, +.table { + overflow-y: hidden; + width: 100%; + font-size: 0.75rem; +} +.table .table-titles th { + background-color: var(--lighter); +} +table > tbody > tr > td, +table > tbody > tr > th, +table > tfoot > tr > td, +table > tfoot > tr > th, +table > thead > tr > td, +table > thead > tr > th, +.table > .tbody > .tr > .td, +.table > .tbody > .tr > .th, +.table > .tfoot > .tr > .td, +.table > .tfoot > .tr > .th, +.table > .thead > .tr > .td, +.table > .thead > .tr > .th, +.table > .tr > .td.cbi-value-field, +.table > .tr > .th.cbi-section-table-cell { + padding: 0.5rem; +} +.container > .cbi-section:first-of-type > .table[width="100%"] > .tr > .td { + padding: 0.6rem; +} +.cbi-section-table-cell { + line-height: 1.1; + align-self: flex-end; + flex: 1 1 auto; +} +tr > td, +tr > th, +.tr > .td, +.tr > .th, +.cbi-section-table-row::before, +#cbi-wireless > #wifi_assoclist_table > .tr:nth-child(2) { + border-top: thin solid #ddd; + padding: 1.1em 1.25rem; +} +#cbi-wireless .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 { + border-top: 0 !important; + background-color: #f6f9fc; + padding: 1.1em 1.25rem; + line-height: 1.3rem; +} +#cbi-network .tr:first-child > .td { + border-top: 0; +} +.table[width="100%"] > .tr:first-child > .td { + margin: auto 0; +} +.cbi-section-table-row { + margin-bottom: 1rem; + text-align: center !important; + background: #f4f4f4; +} +.cbi-section-table-row:last-child { + margin-bottom: 0; +} +.cbi-section-table-row > .cbi-value-field .cbi-dropdown, +.cbi-section-table-row > .cbi-value-field .cbi-input-select, +.cbi-section-table-row > .cbi-value-field .cbi-input-text, +.cbi-section-table-row > .cbi-value-field .cbi-input-password { + width: 100%; +} +.cbi-section-table-row > .cbi-value-field .cbi-input-text, +.cbi-section-table-row > .cbi-value-field .cbi-input-password { + min-width: 80px; +} +.cbi-section-table-row > .cbi-value-field [data-dynlist] > input, +.cbi-section-table-row > .cbi-value-field input.cbi-input-password { + width: calc(100% - 1.5rem); +} +.cbi-section-table-row .td { + text-align: center !important; +} +.cbi-section-table-row .td .cbi-checkbox input[type="checkbox"] { + margin: 0; +} +.control-group { + display: inline-flex; + width: 100%; + flex-wrap: wrap; + gap: 1rem; +} +.control-group input { + border-right-width: 0; + margin-right: 0; +} +.control-group input + button { + border-bottom-left-radius: 0; + border-top-left-radius: 0; + margin-left: 0; + border-left-width: 0; +} +.control-group:has(> input:first-child + .cbi-button) { + gap: 0 !important; +} +.control-group:has(> input:first-child + .cbi-button) input { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + width: 15.5rem; + min-width: 15.5rem; +} +.control-group > * { + vertical-align: middle; +} +div > table > tbody > tr:nth-of-type(2n), +div > .table > .tr:nth-of-type(2n) { + background-color: #f9f9f9; +} +/* fix multiple table */ +table table, +.table .table, +.cbi-value-field table, +.cbi-value-field .table, +td > table > tbody > tr > td, +.td > .table > .tbody > .tr > .td, +.cbi-value-field > table > tbody > tr > td, +.cbi-value-field > .table > .tbody > .tr > .td { + border: 0; +} +/* button style */ +.btn, +.cbi-button, +.item::after { + font-size: 0.875rem; + display: inline-block; + width: auto !important; + padding: 0.5rem 0.75rem; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + transition: all 0.2s ease-in-out; + text-align: center; + vertical-align: middle; + white-space: nowrap; + text-decoration: none; + border: 0; + border-radius: 0.25rem; + background-color: #f0f0f0; + background-image: none; + appearance: none; + -ms-touch-action: manipulation; + touch-action: manipulation; +} +.btn:not(button) ul:not(.dropdown) li { + padding: 0; +} +.cbi-button-up, +.cbi-button-down { + display: inline-block; + min-width: 0; + padding: 0.2rem 1rem; + font-size: 0; + color: transparent !important; + background: url(../icon/arrow.svg) no-repeat center; + background-size: 12px 20px; +} +.cbi-button-up { + transform: scaleY(-1); +} +.cbi-button:not(select) { + appearance: none !important; +} +.btn:hover, +.btn:focus, +.btn:active, +.cbi-button:hover, +.cbi-button:focus, +.cbi-button:active, +.item:hover::after, +.item:focus::after, +.item:active::after, +.cbi-page-actions .cbi-button-apply + .cbi-button-save:hover, +.cbi-page-actions .cbi-button-apply + .cbi-button-save:focus, +.cbi-page-actions .cbi-button-apply + .cbi-button-save:active { + text-decoration: none; + outline: 0; +} +.btn:hover, +.btn:focus, +.cbi-button:hover, +.cbi-button:focus, +.item:hover::after, +.item:focus::after { + box-shadow: 0 3px 9px rgba(50, 50, 9, 0), 3px 4px 8px rgba(94, 114, 228, 0.1); +} +.btn:active, +.cbi-button:active, +.item:active::after { + box-shadow: 0 3px 9px rgba(50, 50, 9, 0), 3px 4px 8px rgba(94, 114, 228, 0.1); +} +.cbi-button-up:hover, +.cbi-button-up:focus { + box-shadow: 0 3px 9px rgba(50, 50, 9, 0), 3px 4px 8px rgba(94, 114, 228, 0.1); +} +.cbi-button-up:active { + box-shadow: 0 3px 9px rgba(50, 50, 9, 0), 3px 4px 8px rgba(94, 114, 228, 0.1); +} +.btn:disabled, +.cbi-button:disabled { + cursor: not-allowed; + pointer-events: none; + opacity: 0.5; + box-shadow: none; +} +/* gray */ +.alert-message [class="btn"], +.modal div[class="btn"], +.cbi-button-find, +.cbi-button-link, +.cbi-button-up, +.cbi-button-down, +.cbi-button-neutral, +.cbi-button[name="zero"], +.cbi-button[name="restart"], +.cbi-button[onclick="hide_empty(this)"] { + color: #fff; + border: thin solid #8898aa; + background-color: #8898aa; +} +/* dark blue */ +.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)"] { + font-weight: normal; + color: #fff !important; + border: thin solid #5e72e4; + border: thin solid var(--primary); + background-color: #5e72e4; + background-color: var(--primary); +} +/* light blue */ +.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)"] { + font-weight: normal; + color: #fff !important; + border: thin solid #5e72e4; + border: thin solid var(--primary); + background-color: #5e72e4; + background-color: var(--primary); +} +/* red */ +.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"] { + font-weight: normal; + color: #fff; + border: thin solid #f5365c; + border: thin solid var(--red); + background-color: #f5365c; + background-color: var(--red); +} +/* yellow */ +.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"] { + font-weight: normal; + color: var(--white); + border: thin solid #eea236; + background-color: #f0ad4e; +} +/* green */ +.cbi-button-success, +.cbi-button-download { + font-weight: normal; + color: var(--white); + border: thin solid #4cae4c; + background-color: #5cb85c; +} +.cbi-page-actions .cbi-button-link:first-child { + float: left; +} +.cbi-page-actions .cbi-dropdown .open { + color: var(--white); +} +.cbi-page-actions .cbi-dropdown .more { + display: block; + width: 1px; + height: 100%; + overflow: hidden; + text-indent: 5000px; + background-color: var(--white); +} +.a-to-btn { + text-decoration: none; +} +.cbi-value-field .cbi-button-add { + font-weight: bold; + padding: 1px 6px; + display: inline-block; + align-items: center; +} +.tabs { + padding: 0 1rem; + background-color: #FFFFFF; + border-radius: 0.25rem; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.03); + white-space: nowrap; + overflow-x: auto; +} +.tabs::-webkit-scrollbar { + width: 1px; + height: 5px; +} +.tabs::-webkit-scrollbar-thumb { + background-color: #f6f9fc; +} +.tabs::-webkit-scrollbar-track { + background-color: #fff; +} +.tabs li[class~="active"], +.tabs li:hover { + cursor: pointer; + border-bottom: 0.18751rem solid #5e72e4; + border-bottom: 0.18751rem solid var(--primary); + color: #5e72e4; + color: var(--primary); + background-color: #e4e9ee; + margin-bottom: 0; + border-radius: 0; +} +.tabs li[class~="active"] a, +.tabs li:hover a { + color: #5e72e4; + color: var(--primary); +} +.tabs li { + font-size: 0.875rem; + display: inline-block; + padding: 0.875rem 0rem; + border-bottom: 0.18751rem solid rgba(0, 0, 0, 0); + margin: 0; + transition: all 0.2s; +} +.tabs li a { + text-decoration: none; + color: #404040; + padding: 0.5rem 0.8rem; +} +.tabs li:hover { + border-bottom: 0.18751rem solid #5e72e4; + border-bottom: 0.18751rem solid var(--primary); +} +.cbi-tabmenu { + color: white; + padding: 0.5rem 1rem 0 1rem; + white-space: nowrap; + overflow-x: auto; +} +.cbi-tabmenu::-webkit-scrollbar { + width: 1px; + height: 5px; +} +.cbi-tabmenu::-webkit-scrollbar-thumb { + background-color: #f6f9fc; +} +.cbi-tabmenu::-webkit-scrollbar-track { + background-color: #fff; +} +.cbi-tabmenu li { + background: #dce3e9; + display: inline-block; + font-size: 0.875rem; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; + padding: 0.5rem 0rem; + border-bottom: 0.18751rem solid rgba(0, 0, 0, 0); + margin: 0 0.2rem; + position: relative; +} +.cbi-tabmenu li a { + text-decoration: none; + color: #404040; + padding: 0.5rem 0.8rem; +} +.cbi-tabmenu li:hover { + cursor: pointer; + border-bottom: 0.18751rem solid #5e72e4; + border-bottom: 0.18751rem solid var(--primary); + color: #5e72e4; + color: var(--primary); + background-color: #e4e9ee; + margin-bottom: 0; +} +.cbi-tabmenu li:hover a { + color: #525f7f; +} +.cbi-tabmenu li[class~="cbi-tab"] { + border-bottom: 0.18751rem solid #5e72e4; + border-bottom: 0.18751rem solid var(--primary); + color: #5e72e4; + color: var(--primary); + background-color: #e4e9ee; + margin-bottom: 0; +} +.cbi-tabmenu li[class~="cbi-tab"] a { + color: #5e72e4; + color: var(--primary); +} +.cbi-tab-descr { + padding: 0 1.25rem; +} +.cbi-section-node { + display: flex; + flex-direction: column; + gap: 0.875rem; +} +.cbi-section-node > [id^="cbi-config-"] { + display: flex; + flex-direction: column; + gap: 0.875rem; +} +.cbi-section-node > [id^="cbi-config-"]:first-child { + padding-top: 1rem; +} +.cbi-section-node > [id^="cbi-config-"]:last-child { + padding-bottom: 1rem; +} +.cbi-section .cbi-section-remove:nth-of-type(2n), +.container > .cbi-section .cbi-section-node:nth-of-type(2n) { + background-color: #f9f9f9; +} +[data-tab-title] { + overflow: hidden; + height: 0; + opacity: 0; + margin: 0; + padding: 1rem 0; + display: none !important; +} +[data-tab-title] p { + margin-left: 1rem; + margin-bottom: 1rem; +} +[data-tab-active="true"] { + overflow: visible; + height: auto; + opacity: 1; + display: inherit !important; + transition: opacity 0.25s ease-in; + margin: inherit !important; +} +.cbi-section[id] .cbi-section-remove:nth-of-type(4n+3), +.cbi-section[id] .cbi-section-node:nth-of-type(4n+4) { + background-color: #f9f9f9; +} +.cbi-section-node-tabbed { + margin-top: 0; + border: 0 solid #d4d4d4; + border-radius: 0.25rem; +} +.cbi-section-node-tabbed > div { + display: flex; + flex-direction: column; + gap: 0.875rem; +} +.cbi-tabcontainer > .cbi-value:nth-of-type(2n) { + background-color: #f9f9f9; +} +.cbi-value-field { + display: table-cell; +} +.cbi-value-field div + br { + display: none; +} +.cbi-value-description { + line-height: 1.25; + display: table-cell; + padding: 0.5rem 0; + opacity: 0.5; + font-size: 0.75rem; +} +.cbi-value-description abbr { + color: #32325d; + color: var(--gray-dark); +} +.cbi-value-description:empty { + display: none; +} +.cbi-value-title { + display: table-cell; + float: left; + width: 23rem; + padding-right: 2rem; + text-align: right; + word-wrap: break-word; +} +.cbi-value { + display: inline-block; + width: 100%; + padding: 0 1rem; + line-height: 2.4rem; +} +.cbi-value ul { + line-height: 1.25; +} +.cbi-value-field.cbi-dropdown-open .cbi-dropdown { + border-color: var(--primary); + box-shadow: 0 3px 9px rgba(50, 50, 9, 0), 3px 4px 8px rgba(94, 114, 228, 0.1); +} +.cbi-value-field .cbi-dropdown, +.cbi-value-field .cbi-input-select, +.cbi-value input[type="text"], +.cbi-value input[type="password"], +.cbi-value textarea { + min-width: 18rem; +} +#cbi-firewall-zone .cbi-input-select, +#cbi-network-switch_vlan .cbi-input-select { + min-width: 11rem; +} +#cbi-network-switch_vlan .cbi-input-text { + max-width: 3rem; +} +.cbi-input-file { + appearance: auto !important; +} +.cbi-input-file::-webkit-file-upload-button { + display: inline-block !important; +} +.cbi-input-invalid { + color: #f5365c !important; + border-color: #f5365c !important; +} +.cbi-section-error { + font-weight: bold; + line-height: 1.42857143; + margin: 18px; + padding: 6px; + border: thin solid #f5365c; + border-radius: 3px; + background-color: #fce6e6; +} +.cbi-section-error ul { + margin: 0 0 0 20px; +} +.cbi-section-error ul li { + font-weight: bold; + color: #f5365c; +} +.td[data-title]::before { + font-weight: bold; + display: none; + padding: 0.25rem 0; + content: attr(data-title) ":\20"; + text-align: left; + white-space: nowrap; +} +.tr.placeholder .td[data-title]::before { + display: none; +} +.tr[data-title]::before, +.tr.cbi-section-table-titles.named::before { + font-weight: bold; + display: table-cell; + align-self: center; + flex: 1 1 5%; + padding: 0.25rem; + content: attr(data-title) "\20"; + text-align: center; + vertical-align: middle; + white-space: normal; + word-wrap: break-word; + background-color: #f6f9fc; +} +.cbi-rowstyle-1 { + background-color: #f9f9f9; +} +.cbi-rowstyle-2 { + background-color: #eee; +} +.cbi-rowstyle-2 .cbi-button-up, +.cbi-rowstyle-2 .cbi-button-down, +body:not(.Interfaces) .cbi-rowstyle-2:first-child { + background-color: #fff !important; +} +.cbi-section-table .cbi-section-table-titles .cbi-section-table-cell { + width: auto !important; +} +.td.cbi-section-actions { + text-align: right !important; + vertical-align: middle; +} +.td.cbi-section-actions > * { + display: inline-flex; + gap: 1rem; +} +.td.cbi-section-actions > * > *, +.td.cbi-section-actions > * > form > * { + display: flex; + align-items: center; +} +.td.cbi-section-actions > * > form { + display: inline-flex; + margin: 0; +} +.td .cbi-checkbox { + justify-content: center; +} +.cbi-checkbox { + display: flex; + align-items: center; + height: 2.5rem; +} +/* lists */ +.cbi-dynlist { + line-height: 1.3; + flex-direction: column; + min-height: 30px; + cursor: text; + gap: 0.875rem; +} +.cbi-dynlist > .item { + display: inline-flex; + flex-wrap: nowrap; + position: relative; + max-width: 25rem; + pointer-events: none; + color: #8898aa; + outline: 0; +} +.cbi-dynlist > .item::after { + content: "\00D7"; + pointer-events: auto; + display: flex; + align-items: center; + justify-content: center; + width: 2.5rem !important; + height: 2.5rem; + margin: 0; + font-weight: normal; + font-size: 1rem; + line-height: 1.5rem; + color: #fff; + border: 1px solid #f5365c; + border-radius: 0 0.25rem 0.25rem 0; + outline: 0; + background-color: var(--red); + background-image: none; + box-shadow: none; + box-sizing: border-box; +} +.cbi-dynlist > .item > span { + display: block; + padding: 0.5rem 0.75rem; + min-width: 15.5rem; + width: 15.5rem; + height: 2.5rem; + overflow: hidden; + text-overflow: ellipsis; + user-select: text; + white-space: nowrap; + word-break: break-word; + line-height: 1.5em; + color: #8898aa; + border: 1px solid #dee2e6; + border-radius: 0.25rem 0 0 0.25rem; + outline: 0; + background-image: none; + box-shadow: none; + box-sizing: border-box; + transition: box-shadow 0.15s ease; +} +.cbi-dynlist > .add-item { + display: inline-flex; + align-items: center; + width: 100%; + min-width: 15.5rem; + flex-wrap: nowrap; +} +.cbi-dynlist > .add-item input { + display: block; + padding: 0.5rem 0.75rem; + box-sizing: border-box; + min-width: 15.5rem; + width: 15.5rem; + transition: box-shadow 0.15s ease; + white-space: nowrap; + word-break: break-word; + font-size: 0.875rem; + line-height: 1.5rem; + color: #8898aa; + border: 1px solid #dee2e6; + border-radius: 0.25rem 0 0 0.25rem; + border-right-width: 0; + outline: 0; + background-image: none; + box-shadow: none; +} +.cbi-dynlist > .add-item .cbi-button { + display: flex; + width: auto !important; + padding-left: 0.8rem; + padding-right: 0.8rem; + margin-left: 0; + align-items: center; + justify-content: center; + font-size: 0.875rem; + line-height: 1.5rem; + outline: 0; + background-image: none; + background-color: var(--gray); + box-shadow: none; + color: var(--white); + border-color: var(--gray); + border-radius: 0.25rem; + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.cbi-dynlist > .add-item .cbi-button-add { + width: 2.5rem !important; + padding: 0.5rem 0 !important; + font-weight: normal; + font-size: 1.2rem; + color: #fff; + background-color: var(--primary); + border: 1px solid var(--primary); +} +.cbi-dynlist > .add-item:not([ondrop]) > input { + overflow: hidden; + min-width: 15.5rem; + width: 15.5rem; + white-space: nowrap; + text-overflow: ellipsis; +} +.cbi-dynlist > .item.drag-over, +.cbi-dynlist > .add-item:has(.drag-over) { + border-top: 1px solid var(--red); + margin-top: -1px; +} +.cbi-dynlist[name="sshkeys"] > .item { + max-width: none; +} +.cbi-dynlist > .cbi-dynlist > .add-item[ondrop] > input { + min-width: 13rem; +} +.cbi-dynlist, +.cbi-dropdown { + position: relative; + display: inline-flex; + padding-right: 0.25rem; + min-height: 2.1875rem; +} +.cbi-dropdown { + align-items: center; +} +.cbi-dropdown.btn > ul:not(.dropdown), +.cbi-dropdown.cbi-button > ul:not(.dropdown) { + margin: 0 0.75rem; +} +.cbi-dropdown[placeholder*="select"] { + max-width: 25rem; + height: auto; + margin-top: -3px; +} +.cbi-dropdown > ul { + display: flex; + overflow-x: hidden; + overflow-y: auto; + width: 100%; + padding: 0; + list-style: none; + outline: 0; +} +.cbi-dropdown > ul.preview { + display: none; +} +.cbi-dropdown.cbi-button-apply, +.cbi-dropdown.cbi-button-action { + padding: 0; +} +.cbi-button-apply > ul.preview { + display: none; +} +.cbi-button-apply > ul.preview li { + color: #fff; +} +.cbi-button-apply > ul:first-child li { + color: #fff; +} +.cbi-dropdown > .open { + display: flex; + align-items: center; + width: 1rem; + height: 100%; + padding: 0 0.75rem; + cursor: pointer; + user-select: none; + font-size: 0; + color: #8898aa; + background-color: currentColor; + mask-image: var(--dropdown-arrow-icon); + mask-repeat: no-repeat; + mask-size: 100% 1rem; + mask-position: center; + mask-mode: match-source; +} +.cbi-dropdown > .more, +.cbi-dropdown > ul > li[placeholder] { + display: none; +} +.cbi-dropdown > ul > li { + display: none; + overflow: hidden; + align-items: center; + align-self: center; + flex-grow: 1; + flex-shrink: 1; + min-height: 20px; + padding: 0.125rem 0.25em; + white-space: nowrap; + text-overflow: ellipsis; +} +.cbi-dropdown > ul > li .hide-open { + display: initial; +} +.cbi-dropdown > ul > li .hide-close { + display: none; +} +.cbi-dropdown > ul > li[display]:not([display="0"]) { + border-left: thin solid #ccc; +} +.cbi-dropdown[empty] > ul { + max-width: 1px; +} +.cbi-dropdown > ul > li > form { + display: none; + margin: 0; + padding: 0; + pointer-events: none; +} +.cbi-dropdown > ul > li img { + margin-right: 0.25em; + vertical-align: middle; +} +.cbi-dropdown > ul > li > form > input[type="checkbox"] { + height: auto; + margin: 0; +} +.cbi-dropdown > ul > li input[type="text"] { + height: 2rem; + min-width: 16rem; + padding: 0 0.5rem; +} +.cbi-dropdown[open] > ul.dropdown { + position: absolute; + z-index: 1100; + display: block; + width: auto; + min-width: 100%; + max-width: none; + max-height: 200px !important; + border: 0 solid #918e8c; + background: #ffffff; + box-shadow: 0 0 4px #918e8c; + border-radius: 0.25rem; + color: var(--main-menu-color); + margin-left: 0 !important; + margin-top: 0.25rem; + left: 0; +} +.cbi-dropdown[open] > ul.dropdown li { + color: #000; +} +.cbi-dropdown > ul > li[display], +.cbi-dropdown[open] > ul.preview, +.cbi-dropdown[open] > ul.dropdown > li, +.cbi-dropdown[multiple] > ul > li > label, +.cbi-dropdown[multiple][open] > ul.dropdown > li, +.cbi-dropdown[multiple][more] > .more, +.cbi-dropdown[multiple][empty] > .more { + display: flex; + align-items: center; + flex-grow: 1; +} +.cbi-dropdown[empty] > ul > li, +.cbi-dropdown[optional][open] > ul.dropdown > li[placeholder], +.cbi-dropdown[multiple][open] > ul.dropdown > li > form { + display: block; +} +.cbi-dropdown[open] > ul.dropdown > li .hide-open { + display: none; +} +.cbi-dropdown[open] > ul.dropdown > li .hide-close { + display: initial; +} +.cbi-dropdown[open] > ul.dropdown > li { + border-bottom: thin solid #ccc; + padding: 0.5rem 0.75rem; + cursor: pointer; +} +.cbi-dropdown[open] > ul.dropdown > li label { + margin-left: 0.5rem; +} +.cbi-dropdown[open] > ul.dropdown > li[selected] { + background: #e4e9ee; +} +.cbi-dropdown[open] > ul.dropdown > li.focus { + background: #e4e9ee; + outline: none; +} +.cbi-dropdown[open] > ul.dropdown > li:last-child { + margin-bottom: 0; + border-bottom: 0; +} +.cbi-dropdown[open] > ul.dropdown > li[unselectable] { + opacity: 0.7; +} +.cbi-dropdown[open] > ul.dropdown > li > input.create-item-input:first-child:last-child { + width: 100%; +} +.cbi-dropdown[disabled] { + pointer-events: none; + opacity: 0.6; +} +.cbi-dropdown .zonebadge { + width: 100%; +} +.cbi-dropdown[open] .zonebadge { + width: auto; +} +/* progressbar */ +.cbi-progressbar { + position: relative; + display: flex; + width: 100%; + font-size: 0.75rem; + background-color: #e9ecef; + border-radius: 0.5rem; + height: 1rem; + overflow: hidden; +} +.cbi-progressbar > div { + display: block; + position: absolute; + height: 100%; + background-color: var(--primary); + border-radius: 0.5rem; + transition: width 0.3s; +} +.cbi-progressbar::after { + content: attr(title); + position: absolute; + font-size: 0.75rem; + color: var(--bs-heading-color); + width: 100%; + height: 100%; + text-align: center; + line-height: 1rem; + z-index: 2; +} +#modal_overlay { + position: fixed; + z-index: 900; + top: 0; + right: 10000px; + bottom: 0; + left: -10000px; + overflow-y: scroll; + transition: opacity 0.125s ease-in; + opacity: 0; + background: rgba(0, 0, 0, 0.7); + -webkit-overflow-scrolling: touch; +} +.modal { + display: flex; + align-items: center; + flex-wrap: wrap; + width: 90%; + min-width: 270px; + max-width: 600px; + min-height: 32px; + margin: 5em auto; + padding: 1rem; + border-radius: 0.25rem !important; + background: #fff; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 2px 0 rgba(0, 0, 0, 0.12); +} +.modal > * { + line-height: normal; + flex-basis: 100%; + margin-bottom: 0.5em; + max-width: 100%; +} +.modal > pre, +.modal > textarea { + font-size: 1rem; + font-size-adjust: 0.35; + overflow: auto; + padding: 0.5rem; + cursor: auto; + white-space: pre-wrap; + color: var(--dark-primary); + outline: 0; + border-radius: 0.25rem; + border: 1px solid var(--lighter); + transition: all 0.2s ease; +} +.modal > pre:focus, +.modal > textarea:focus { + border: 1px solid var(--primary); + box-shadow: 0 3px 9px rgba(50, 50, 9, 0), 3px 4px 8px rgba(94, 114, 228, 0.1); +} +.modal > h4 { + display: block; + flex-grow: 1; + max-width: none; + padding: 1rem; + margin: -1rem -1rem 0 -1rem; + font-size: 1rem; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.03); + border-radius: 0.25rem 0 0 0.25rem; +} +.modal h5 { + margin-top: 1rem; + font-weight: 600; +} +.modal label > input[type="checkbox"] { + top: 0; +} +.modal ul li { + list-style-type: square; + color: #808080; +} +.modal p { + word-break: break-word; + margin-top: 1rem; +} +.modal .label { + font-size: 0.6rem; + font-weight: normal; + padding: 0.1rem 0.3rem; + padding-bottom: 0; + cursor: default; + border-radius: 0; +} +.modal .label.warning { + background-color: #f0ad4e !important; +} +.modal .btn { + padding: 0.45rem 0.8rem; +} +.modal.cbi-modal { + max-width: 90%; + max-height: none; +} +.modal .cbi-map { + margin-bottom: 1rem; +} +body.modal-overlay-active { + overflow: hidden; + height: 100vh; +} +body.modal-overlay-active #modal_overlay { + right: 0; + left: 0; + opacity: 1; +} +.spinning { + position: relative; + padding-left: 32px !important; +} +.spinning::before { + position: absolute; + top: 0; + bottom: 0; + left: 0.2em; + width: 32px; + content: ""; + background: url(/luci-static/resources/icons/loading.svg) no-repeat center; + background-size: 16px; +} +/* luci */ +.hidden { + display: none; +} +.left, +.left::before { + text-align: left !important; +} +.right, +.right::before { + text-align: right !important; +} +.button-row { + display: flex; + flex-direction: row; + gap: 1rem; + align-items: center; + justify-content: flex-end; + margin-bottom: 0 !important; +} +.center, +.center::before { + text-align: center !important; +} +.top { + align-self: flex-start !important; + vertical-align: top !important; +} +.bottom { + align-self: flex-end !important; + vertical-align: bottom !important; +} +.inline { + display: inline; +} +.cbi-page-actions { + padding: 1rem; + justify-content: flex-end; + display: flex; + gap: 1rem; +} +.cbi-page-actions > form[method="post"] { + display: inline-block; +} +.th[data-type="button"], +.td[data-type="button"], +.th[data-type="fvalue"], +.td[data-type="fvalue"] { + flex: 1 1 2em; + text-align: center; +} +.ifacebadge { + display: inline-flex; + align-items: center; + gap: 0.2rem; + padding: 0.25rem 0.8rem; + background: #eee; + border-radius: 4px; +} +td > .ifacebadge, +.td > .ifacebadge { + font-size: 0.875rem; + background-color: #f0f0f0; +} +.ifacebadge > em, +.ifacebadge > img { + display: inline-block; + margin: 0 0.75rem; +} +.ifacebadge > img + img { + margin: 0 0.2rem 0 0; +} +.network-status-table { + display: flex; + flex-wrap: wrap; +} +.network-status-table .ifacebox { + flex-grow: 1; + border-radius: 0.25rem; + overflow: hidden; + margin: 1rem; +} +.network-status-table .ifacebox-body { + display: flex; + flex-direction: column; + height: 100%; + gap: 0.5em; +} +.network-status-table .ifacebox-body > span { + flex: 10 10 auto; +} +.network-status-table .ifacebox-body > div { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + height: 100%; +} +.network-status-table .ifacebox-body .ifacebadge { + align-items: center; + flex: 1 1 auto; + min-width: 220px; + padding: 0.5em; + background-color: #fff; +} +.network-status-table .ifacebox-body .ifacebadge > span { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +/* textarea */ +.cbi-input-textarea { + font-family: inherit; + width: 100%; + font-size: 0.875rem; + min-height: 14rem; + padding: 0.8rem; + color: #8898aa; + border-radius: 0.25rem; + border: 1px solid #dee2e6; + min-width: 16rem; +} +#content_syslog { + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.03); +} +#syslog { + font-size: small; + font-family: 'Google Sans'; + line-height: 1.25; + width: 100%; + min-height: 15rem; + padding: 1rem; + resize: none; + color: #242424; + border: 0; + border-radius: 0.25rem; + background-color: #ffffff; +} +#syslog:focus { + outline: 0; +} +#cbi-ddns #syslog { + overflow: auto; +} +/* config changes */ +.uci-change-list { + font-family: inherit; + overflow: scroll; + width: 100%; + display: flex; + flex-direction: column; + flex-wrap: wrap; +} +.uci-change-list ins, +.uci-change-legend-label ins { + display: block; + padding: 2px; + text-decoration: none; + border: thin solid #0f0; + background-color: #cfc; +} +.uci-change-list del, +.uci-change-legend-label del { + font-style: normal; + display: block; + padding: 2px; + text-decoration: none; + border: thin solid #f00; + background-color: #fcc; +} +.uci-change-list var, +.uci-change-legend-label var { + font-style: normal; + display: block; + padding: 2px; + text-decoration: none; + border: thin solid #ccc; + background-color: #eee; +} +.uci-change-list var ins, +.uci-change-list var del { + font-style: normal; + padding: 0; + white-space: pre; + border: 0; +} +.uci-change-legend { + padding: 5px; +} +.uci-change-legend-label { + float: left; + width: 150px; +} +.uci-change-legend-label > ins, +.uci-change-legend-label > del, +.uci-change-legend-label > var { + display: block; + float: left; + width: 10px; + height: 10px; + margin-right: 4px; +} +.uci-change-legend-label var ins, +.uci-change-legend-label var del { + line-height: 0.4; + border: 0; +} +.uci-change-list var, +.uci-change-list del, +.uci-change-list ins { + padding: 0.5rem; +} +.uci-dialog .cbi-section { + padding: 0.5rem; +} +.uci-dialog .cbi-section .uci-change-legend { + line-height: 15px; + padding: 10px 20px 0 20px; +} +.uci-dialog .cbi-section .uci-change-legend .uci-change-legend-label { + padding: 0; + margin: 0; + position: relative; + float: none; + display: inline-block; + width: 25%; +} +.uci-dialog .cbi-section .uci-change-legend .uci-change-legend-label > ins, +.uci-dialog .cbi-section .uci-change-legend .uci-change-legend-label > del { + width: 14px; + height: 14px; +} +.uci-dialog .cbi-section .uci-change-legend .uci-change-legend-label > var { + position: relative; + width: 14px; + height: 14px; +} +.uci-dialog .cbi-section .uci-change-legend .uci-change-legend-label > var ins, +.uci-dialog .cbi-section .uci-change-legend .uci-change-legend-label > var del { + position: absolute; + left: 2px; + top: 2px; + right: 2px; + bottom: 2px; +} +.uci-dialog .cbi-section .uci-change-list { + overflow: auto; +} +.uci-dialog .cbi-section .uci-change-list + .right .btn { + color: #333; +} +.uci-dialog .cbi-section .uci-change-list + .right .cbi-dropdown ul:not(.dropdown) li { + color: #fff; +} +.uci-dialog .cbi-section .uci-change-list + .right .cbi-button { + padding: 0.45rem 0.8rem; +} +/* other fix */ +#iwsvg, +#iwsvg2, +#bwsvg { + border: thin solid #d4d4d4 !important; +} +#iwsvg { + border-top: 0 !important; +} +.ifacebox { + line-height: 1.25; + display: inline-flex; + overflow: hidden; + flex-direction: column; + border-radius: 4px; + min-width: 100px; + background-color: #f9f9f9; +} +.ifacebox-head { + padding: 0.25em; + background: #eee; +} +.ifacebox-head.active { + background: #5e72e4; + background: var(--primary); +} +.ifacebox-head.active * { + color: #fff; + color: var(--white); +} +.ifacebox-body { + padding: 0.875rem 1rem; + line-height: 1.6em; +} +.cbi-image-button { + margin-left: 0.5rem; +} +.zonebadge { + display: inline-block; + padding: 0.2rem 0.5rem; + border-radius: 4px; +} +.zonebadge .ifacebadge { + margin: 0.1rem 0.2rem; + padding: 0.2rem 0.3rem; + border: thin solid #6c6c6c; +} +.zonebadge > input[type="text"] { + min-width: 10rem; + margin-top: 0.3rem; + padding: 0.16rem 1rem; +} +.zonebadge > em, +.zonebadge > strong { + display: inline-block; + margin: 0 0.2rem; +} +.cbi-value-field .cbi-input-checkbox, +.cbi-value-field .cbi-input-radio { + margin-top: 0.1rem; +} +.cbi-value-field > ul > li { + display: flex; +} +.cbi-value-field > ul > li > label { + margin-top: 0.5rem; +} +.cbi-value-field > ul > li .ifacebadge { + margin-top: -0.5rem; + margin-left: 0.4rem; + background-color: #eee; +} +.cbi-section-table-row > .cbi-value-field .cbi-dropdown { + min-width: 3rem; +} +.cbi-section-create { + display: inline-flex; + align-items: center; + padding: 0.875rem 1rem; +} +.cbi-section-create > div:first-child > input { + width: 100%; + border-right: none; + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.cbi-section-create > div:first-child + button { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.cbi-section-remove { + padding: 0.5rem 1rem; +} +div.cbi-value var, +td.cbi-value-field var, +.td.cbi-value-field var { + font-style: italic; + color: #0069d6; +} +.cbi-optionals { + padding: 1rem 1rem 0 1rem; + border-top: thin solid #ccc; +} +.cbi-dropdown-container { + position: relative; +} +.cbi-tooltip-container, +span[data-tooltip], +span[data-tooltip] .label { + cursor: help !important; +} +.cbi-tooltip { + position: absolute; + z-index: 1000; + left: -10000px; + box-shadow: 0 3px 9px rgba(50, 50, 9, 0), 3px 4px 8px rgba(94, 114, 228, 0.1); + border-radius: 0.25rem; + background: #fff; + white-space: pre; + padding: 0.5rem; + opacity: 0; + transition: opacity 0.25s ease-in; + transform: translate(-50%, 10%); +} +.cbi-tooltip-container:hover .cbi-tooltip:not(:empty) { + left: auto; + transition: opacity 0.25s ease-in; + opacity: 1; +} +.zonebadge .cbi-tooltip { + margin: -1.5rem 0 0 -0.5rem; + padding: 0.25rem; + background: inherit; +} +.zonebadge-empty { + color: #404040; + background: repeating-linear-gradient(45deg, rgba(204, 204, 204, 0.5), rgba(204, 204, 204, 0.5) 5px, rgba(255, 255, 255, 0.5) 5px, rgba(255, 255, 255, 0.5) 10px); +} +.zone-forwards { + display: flex; + min-width: 10rem; +} +.zone-forwards > * { + flex: 1 1 45%; +} +.zone-forwards > span { + flex-basis: 10%; + padding: 0 0.25rem; + text-align: center; +} +.zone-forwards .zone-src, +.zone-forwards .zone-dest { + display: flex; + flex-direction: column; +} +.label { + font-size: 0.875rem; + font-weight: bold; + padding: 0.3rem 0.8rem; + white-space: nowrap; + text-decoration: none; + text-transform: uppercase; + color: #fff !important; + border-radius: 3px; + background-color: #bfbfbf; + text-shadow: none; +} +label > input[type="checkbox"], +label > input[type="radio"] { + position: relative; + top: 0.4rem; + right: 0.2rem; + margin: 0; + vertical-align: bottom; +} +label[data-index][data-depends] { + padding-right: 2em; +} +.showSide { + display: none; +} +.darkMask { + position: fixed; + z-index: 99; + display: none; + width: 100%; + height: 100%; + content: ""; + top: 0; + background-color: rgba(0, 0, 0, 0.56); + transition: all 0.2s; +} +.darkMask.active { + display: block; +} +/* diagnostics */ +#diag-rc-output > pre, +#command-rc-output > pre, +[data-page="admin-services-wol"] .notice code { + font-size: 1.2rem; + font-size-adjust: 0.35; + line-height: normal; + display: block; + overflow-y: hidden; + width: 100%; + padding: 8.5px; + white-space: pre; + color: #eee; + background-color: #101010; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 2px 0 rgba(0, 0, 0, 0.12); +} +input[name="ping"], +input[name="traceroute"], +input[name="nslookup"] { + width: 80%; +} +.controls { + gap: 0.5rem; + margin: 0 1.25rem !important; +} +.controls > div { + gap: 0.5rem; +} +.controls > * > .btn:not([aria-label$="page"]) { + flex-grow: initial !important; + margin-top: 0.25rem; +} +.controls > #pager > .btn[aria-label$="page"] { + font-size: 1.4rem; + font-weight: bold; +} +.controls > * > label { + margin-bottom: 0.2rem; +} +.td.version, +.td.size { + white-space: normal !important; + word-break: break-word; +} +.cbi-tabmenu + .cbi-section { + margin-top: 0; +} +.cbi-tab-disabled[data-errors]::after { + position: absolute; + top: -0.25rem; + right: -0.25rem; + content: attr(data-errors); + background-color: var(--red); + color: #fff; + width: 0.875rem; + height: 0.875rem; + border-radius: 0.875rem; + text-align: center; + display: inline-flex; + flex-direction: column; + justify-content: center; + font-size: 0.75em; +} +/* custom commands */ +.commands { + display: grid !important; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 0.75rem; +} +.commandbox { + padding: 0.5rem 1rem; + gap: 0.5rem; + border-bottom: thin solid #ccc; + border-radius: 0.25rem; + background: #eee; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} +.commandbox h3 { + line-height: normal !important; + overflow: hidden; + margin: 6px 0 !important; + white-space: nowrap; + text-overflow: ellipsis; +} +.commandbox div { + left: auto !important; +} +.commandbox code { + overflow: hidden; + max-width: fit-content; + padding: 2px 3px; + white-space: nowrap; + text-overflow: ellipsis; +} +.commandbox code:hover { + overflow-y: auto; + max-height: 50px; + white-space: normal; +} +.commandbox p:first-of-type { + margin-top: -6px; +} +.commandbox p:nth-of-type(2) { + margin-top: 2px; +} +#command-rc-output .alert-message { + line-height: 1.42857143; + position: absolute; + top: 40px; + right: 32px; + max-width: 40%; + margin: 0; + animation: anim-fade-in 1.5s forwards; + word-break: break-word; + opacity: 0; +} +@keyframes anim-fade-in { + 100% { + opacity: 1; + } +} +/* other fix */ +.fb-container .cbi-button { + height: auto !important; +} +#cbi-usb_printer-printer em { + display: block; + padding: 1rem; + text-align: center; +} +pre.command-output { + padding: 1.5rem; +} +/* page fix */ +[data-page="admin-system-autoreboot"] #cbi-autoreboot { + margin-top: 0; +} +[data-page="admin-system-system"] .control-group { + gap: 0.875rem; +} +[data-page="admin-system-system"] .cbi-dynlist { + margin: 0.25rem 0; +} +[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 { + margin-left: 0; + color: var(--gray-dark); +} +[data-page="admin-system-admin"] .cbi-section-node, +[data-page="admin-system-admin-password"] .cbi-section-node { + padding: 1rem 0; +} +[data-page="admin-system-admin-sshkeys"] .cbi-dynlist { + margin-left: 1rem; +} +[data-page="admin-system-startup"] #view > div:first-child div[data-initialized="true"] { + margin-top: -0.4375rem; +} +[data-page="admin-system-startup"] [data-tab-title] p { + margin-left: 0; + margin-bottom: 0; + display: flex; + align-items: center; + justify-content: center; +} +[data-page="admin-system-startup"] textarea { + line-height: 1.25; + overflow-y: auto; + width: 100%; + min-height: 15rem; + margin: 0 1rem; + padding: 1rem; + resize: none; + color: #8898aa; + border-radius: 0.25rem; + border: 1px solid #dee2e6; +} +[data-page="admin-system-startup"] textarea:focus-visible { + outline: none; + box-shadow: none; + border: 1px solid var(--primary); +} +[data-page="admin-system-crontab"] #view p textarea { + line-height: 1.25; + overflow-y: hidden; + width: 100%; + min-height: 15rem; + padding: 1rem; + resize: none; + background-color: transparent; + background: var(--white); + outline: none; + color: #8898aa; + border-radius: 0.25rem; + border: 1px solid #dee2e6; + transition: all 0.2s ease; +} +[data-page="admin-system-crontab"] #view p textarea:focus-visible { + outline: none; + box-shadow: none; + border: 1px solid var(--primary); +} +[data-page="admin-system-crontabhelper"] .crontab-row .dropdown-container { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.5rem; +} +[data-page="admin-system-crontabhelper"] .crontab-row .dropdown-container div { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.5rem; +} +[data-page="admin-system-partexp-global"] .cbi-section { + padding: 1rem 0; +} +[data-page="admin-system-attendedsysupgrade"] #view .cbi-button { + margin-left: 0 !important; + margin-top: 1rem !important; +} +[data-page="admin-system-attendedsysupgrade-configuration"] .cbi-map .cbi-map-descr { + padding-bottom: 0; +} +[data-page="admin-system-flash"] .cbi-value { + padding: 0 1rem; +} +[data-page="admin-system-flash"] .cbi-section .cbi-section { + margin-top: 0; +} +[data-page="admin-system-flash"] .cbi-map-tabbed { + border-radius: 0.25rem; +} +[data-page="admin-system-flash"] .cbi-section-node { + padding-top: 0; + padding-bottom: 0.5rem; +} +[data-page="admin-system-flash"] legend { + font-size: 1.2rem; + width: 100%; + display: block; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); + line-height: 1.5; + margin-bottom: 0; + letter-spacing: 0.1rem; + color: #32325d; + font-weight: bold; + padding: 1rem 0 1rem 1rem; +} +[data-page="admin-system-flash"] .cbi-section-descr { + font-weight: 600; + padding: 1rem 0 1rem 1rem; + color: #525f7f; +} +[data-page="admin-system-flash"] .cbi-page-actions { + padding: 0rem 1rem 1rem 0rem; +} +[data-page="admin-system-flash"] .modal label > input[type="checkbox"] { + top: -0.25rem; +} +[data-page="admin-system-flash"] .modal .btn { + white-space: normal !important; +} +[data-page="admin-system-flash"] .modal label > input[type="checkbox"] { + vertical-align: text-top; + top: auto; +} +[data-page="admin-system-filetransfer"] #cbi-upload { + margin-top: 0; +} +[data-page="admin-system-filetransfer"] .cbi-section-table { + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.03); +} +[data-page="admin-system-fileassistant"] #upload-toggle { + display: none !important; +} +[data-page="admin-system-fileassistant"] .fb-container .panel-title { + padding: 0.5rem 0.75rem !important; +} +[data-page="admin-system-fileassistant"] .cbi-section.fb-container { + padding: 0.5rem; +} +[data-page="admin-system-fileassistant"] .cbi-section.fb-container label.cbi-value-title { + line-height: 1.5rem; + padding: 0.5rem 0.75rem; + width: 60px; + text-align: left; +} +[data-page="admin-system-fileassistant"] .cbi-section.fb-container div.cbi-value-field { + width: 100%; + display: block; + padding-left: 60px; +} +[data-page="admin-system-fileassistant"] .cbi-section.fb-container div#list-content table.cbi-section-table thead td.cbi-section-table-cell, +[data-page="admin-system-fileassistant"] .cbi-section.fb-container div#list-content table.cbi-section-table tbody td.cbi-section-table-cell { + width: 232px; +} +[data-page="admin-system-fileassistant"] .cbi-section.fb-container div#list-content tbody tr:nth-child(1) td.parent-icon strong { + margin-left: 0 !important; +} +[data-page="admin-system-fileassistant"] .cbi-section.fb-container div#list-content tbody td.cbi-value-field.file-icon strong, +[data-page="admin-system-fileassistant"] .cbi-section.fb-container div#list-content tbody td.cbi-value-field.folder-icon strong { + vertical-align: middle; + margin-left: 5px; +} +[data-page="admin-system-fileassistant"] .fb-container .panel-container { + border-bottom-color: #dee2e6; + display: flex; +} +[data-page="admin-system-fileassistant"] .fb-container .panel-container .panel-title { + flex: 1; +} +[data-page="admin-system-fileassistant"] .fb-container .upload-container { + display: flex !important; +} +[data-page="admin-system-fileassistant"] .fb-container .upload-container .upload-file { + flex: 1; + margin-right: 0 !important; +} +[data-page="admin-system-opkg"] h2 { + margin-left: 0; + color: var(--gray-dark); +} +[data-page="admin-system-opkg"] input[name="filter_i18n"] { + top: 2px; + vertical-align: text-top; +} +[data-page="admin-system-opkg"] div.btn { + line-height: 3; + display: inline; + padding: 0.3rem 0.6rem; +} +[data-page="admin-system-opkg"] #maincontent > .container { + margin: 0 1.25rem 1rem 1.25rem; + margin-bottom: 1rem; +} +[data-page="admin-system-package-manager"] .controls div:nth-child(5) > label { + margin-bottom: 5px; +} +[data-page="admin-system-package-manager"] .controls div:nth-child(5) > div label { + margin-top: 1rem; +} +[data-page="admin-system-package-manager"] .controls div:nth-child(5) > div label input { + top: -2px; + right: 0; + vertical-align: middle; +} +[data-page="admin-system-reboot"] p { + padding-left: 1.5rem; +} +[data-page="admin-system-reboot"] p > span { + position: relative; + top: 0.1rem; + left: 1rem; +} +[data-page="admin-system-reboot"] .cbi-button { + background: #fb6340 !important; + border-color: #fb6340 !important; + margin-left: 0 !important; +} +[data-page="admin-system-reboot"] .cbi-button.cbi-button-action.important { + align-self: flex-end; +} +/* applyreboot fix */ +#applyreboot-container { + margin: 2rem; +} +#applyreboot-section { + line-height: 300%; + margin: 2rem; +} +[data-page="admin-system-poweroff"] .container h2 + br + p { + margin-bottom: 1rem; + padding-left: 1.5rem; +} +[data-page="admin-system-poweroffdevice"] .container h2 { + margin: 0; +} +[data-page="admin-system-poweroffdevice"] .container h2 + p { + margin-bottom: 1rem; + padding-left: 1.5rem; +} +[data-page="admin-system-poweroffdevice"] .container button + div { + display: none; +} +[data-page="admin-system-poweroffdevice"] .btn.cbi-button.cbi-button-negative { + align-self: flex-end; +} +[data-page="admin-network-network"] .cbi-value-field .cbi-dynlist { + padding: 0 !important; +} +[data-page="admin-network-network"] .td > .ifacebadge > .cbi-tooltip-container { + display: flex; +} +[data-page="admin-network-network"] .td > .ifacebadge > .cbi-tooltip-container img { + vertical-align: middle; +} +[data-page="admin-network-network"] div[data-name="_gen_server_keypair"] .cbi-value-title, +[data-page="admin-network-network"] div[data-name="_gen_peer_keypair"] .cbi-value-title, +[data-page="admin-network-network"] div[data-name="_gen_psk"] .cbi-value-title { + height: 2.4rem; +} +[data-page="admin-network-network"] #modal_overlay > .modal.cbi-modal > div > p > textarea { + height: 20em !important; + border: 1px solid #dee2e6 !important; + border-radius: 4px; +} +[data-page="admin-network-dhcp"] .cbi-value { + padding: 0; +} +[data-page="admin-network-dhcp"] [data-tab-active="true"] { + padding: 1rem 1rem !important; +} +[data-page="admin-network-diagnostics"] .table { + box-shadow: none; +} +[data-page="admin-network-diagnostics"] .cbi-section { + padding: 1rem; + font-family: monospace; + background: #fff !important; +} +[data-page="admin-network-diagnostics"] textarea { + background: transparent; + border-radius: 0.25rem; + color: #8898aa; + border: 1px solid #dee2e6; + padding: 0.5rem; +} +[data-page="admin-network-diagnostics"] .tr { + display: flex; + flex-direction: row; +} +[data-page="admin-network-diagnostics"] .tr .td { + background-color: #fff !important; + border-bottom: 1px solid #dee2e6 !important; + display: flex; + flex-direction: row; + align-items: center; + flex: 1; +} +[data-page="admin-network-diagnostics"] .tr .td input { + margin: 0 !important; + border-right: none !important; + border-bottom-right-radius: 0 !important; + border-top-right-radius: 0 !important; +} +[data-page="admin-network-diagnostics"] .tr .td .cbi-dropdown, +[data-page="admin-network-diagnostics"] .tr .td .cbi-button { + height: 2.5rem; + border-left: none !important; + border-bottom-left-radius: 0 !important; + border-top-left-radius: 0 !important; +} +[data-page="admin-network-diagnostics"] .tr .td .cbi-dropdown .more, +[data-page="admin-network-diagnostics"] .tr .td .cbi-button .more { + display: block; + width: 1px; + height: 100%; + overflow: hidden; + text-indent: 5000px; + background-color: var(--white); +} +[data-page="admin-network-diagnostics"] .cbi-dropdown .open { + color: var(--white); +} +[data-page="admin-network-firewall-custom"] #view p, +[data-page="admin-status-routes"] #view p { + padding: 0 1.25rem; +} +[data-page="admin-network-firewall-custom"] #view p textarea, +[data-page="admin-status-routes"] #view p textarea { + padding: 1rem; + border-radius: 0.25rem; +} +[data-page="admin-network-firewall-custom"] #view > h3, +[data-page="admin-status-routes"] #view > h3 { + border-radius: 0.25rem 0.25rem 0 0; +} +[data-page="admin-network-firewall-custom"] #view .cbi-tabmenu + div, +[data-page="admin-status-routes"] #view .cbi-tabmenu + div { + margin-top: -0.5rem; +} +.cbi-section.fade-in .cbi-title { + position: relative; +} +.cbi-section.fade-in .cbi-title > div:last-child { + position: absolute; + right: 1.25rem; + top: 0; +} +.cbi-section.fade-in .cbi-title > div:last-child span { + font-size: 0; + background: none!important; + color: #ced4da !important; +} +.cbi-section.fade-in .cbi-title > div:last-child span:after { + transition: all 0.3s; + font-family: 'argon' !important; + content: '\e90f'; + font-size: 1.1rem; + padding: 0.8755rem 0; + position: absolute; + right: 0; +} +.cbi-section.fade-in .cbi-title > div:last-child span[data-style=inactive]:after { + transform: rotate(90deg); +} +[data-page="admin-status"] #view > div:first-child, +[data-page="admin-status-overview"] #view > div:first-child { + gap: 0 !important; +} +[data-page="admin-status-iptables"] .right { + margin-bottom: 0 !important; +} +[data-page="admin-status-nftables"] .nft-chain-hook { + padding: 0.5rem 1.25rem; +} +[data-page="admin-nlbw-display"] .cbi-section[data-tab="export"] { + padding: 1.5rem !important; +} +[data-page="admin-nlbw-backup"] form { + padding-left: 1.5rem; +} +[data-page="admin-services-ddns"] #syslog { + overflow: auto; + font-size: 12px !important; +} +[data-page="admin-services-ttyd"] .container { + display: flex; + flex-direction: column; +} +[data-page="admin-services-ttyd"] #view { + flex: 1; +} +[data-page="admin-services-ttyd"] #view iframe { + height: 100%; +} +#cbi-dockerd .cbi-section { + box-sizing: border-box; + padding: 16px; +} +#cbi-dockerd .cbi-section.cbi-tblsection { + padding: 0; +} +#cbi-docker .cbi-section .cbi-section-node { + box-sizing: border-box; + padding: 16px; +} +[data-page="admin-services-npc"] div[id="cbid.npc.config.vkey"] { + white-space: normal; +} +[data-page="admin-services-npc"] div[id="cbid.npc.config.vkey"] input[id="widget.cbid.npc.config.vkey"][type="password"] { + margin-top: 0; + margin-bottom: 0; +} +[data-page="admin-services-npc"] div[id="cbid.npc.config.vkey"] .cbi-button { + margin: 0; + border: none; +} +[data-page="admin-services-npc"] div[id^="cbid.npc."][id$=".server_addr"]:not([id="cbid.npc.config.server_addr"]) + br, +[data-page="admin-services-npc"] div[id^="cbid.npc."][id$=".vkey"]:not([id="cbid.npc.config.vkey"]) + br, +[data-page="admin-services-npc"] div[id^="cbid.npc."][id$=".protocol"]:not([id="cbid.npc.config.protocol"]) + br, +[data-page="admin-services-npc"] div[id^="cbid.npc."][id$=".dns"]:not([id="cbid.npc.config.dns"]) + br { + display: none; +} +[data-page="admin-services-npc"] div.cbi-value.nowrap { + white-space: normal; +} +[data-page^="admin-services-openclash"] .oc { + --bg-light: #fff; + --bg-gray: #fff; + border-radius: 8px; +} +[data-page^="admin-services-openclash"] .oc .developer-container { + background: transparent; +} +[data-page^="admin-services-openclash"] #cbi-openclash > fieldset { + background: none; + padding: 0; +} +[data-page^="admin-services-openclash"] #cbi-openclash > fieldset > table > tbody > tr > td { + border: none; + padding: 0; +} +[data-page^="admin-services-openclash"] #cbi-openclash > fieldset .main-card { + border: none; + box-shadow: none; + padding: 0 10px 10px 10px; + background: transparent; +} +[data-page^="admin-services-openclash"] #cbi-openclash > fieldset .myip-main-card { + margin: 0; + padding: 10px; + border: none; + background: transparent; +} +[data-page^="admin-services-openclash"] #cbi-openclash > fieldset .myip-main-card .myip-section-title { + margin: 0; + border-width: 1px; +} +[data-page^="admin-services-openclash"] .sub-card .card-title { + margin-top: 5px; +} +[data-page^="admin-services-openclash"] .oc .main-cards-container { + margin: 0 !important; + gap: 0 !important; +} +[data-page^="admin-services-openclash"] .oc .config-file-bottom { + margin-bottom: 5px; +} +[data-page^="admin-services-openclash"] .oc .config-file-bottom .card-actions { + margin-bottom: 2px !important; +} +[data-page^="admin-services-openclash"] .oc .card-content { + align-items: center !important; + justify-content: center !important; +} +[data-page^="admin-services-openclash"] .oc .card-controls { + align-self: center; +} +[data-page^="admin-services-openclash"] .oc .core-main-controls { + justify-content: center !important; +} +[data-page^="admin-services-openclash"] .oc .plugin-toggle-container { + margin-left: inherit !important; +} +[data-page^="admin-services-openclash"] .oc .core-status-toggle { + flex: 0 !important; + min-width: auto !important; +} +[data-page^="admin-services-openclash"] .oc .config-upload-content { + background: #fff !important; +} +[data-page^="admin-services-openclash"] .oc .subscription-info-container { + background: transparent !important; +} +[data-page^="admin-services-openclash"] .cbi-tabmenu > li { + border-right: none !important; + margin: 0 0.4rem 0 0 !important; +} +[data-page^="admin-services-openclash"] .cbi-tabmenu > li:last-child { + margin-right: 0 !important; +} +[data-page^="admin-services-openclash"] #tab-content .dom { + padding: 0 1rem 1rem 1rem; +} +[data-page^="admin-services-openclash"] .cbi-input-file { + padding: 0.2813rem; + width: 15rem !important; +} +[data-page^="admin-services-openclash"] [id="container.openclash.config.debug"] fieldset { + border: none !important; + padding: 1rem !important; +} +[data-page^="admin-services-openclash"] #diag-rc-output > pre, +[data-page^="admin-services-openclash"] #dns-rc-output > pre { + font-size: 0.875rem; + color: #8898aa; + border: 1px solid #dee2e6; + background-color: transparent; + border-radius: 0.25rem; + font-family: 'Google Sans' !important; + box-shadow: none; +} +[data-page^="admin-services-openclash"] #debug-rc-output > textarea { + font-family: 'Google Sans' !important; +} +[data-page^="admin-services-openclash"] .CodeMirror { + font-size: inherit; + font-family: 'Google Sans' !important; +} +[data-page^="admin-services-openclash"] .cbi-button-up, +[data-page^="admin-services-openclash"] .cbi-button-down { + padding: 0.8rem 1.5rem; + background-color: #f1f1f1; + font-size: 0; +} +[data-page^="admin-services-openclash"] select#CORE_VERSION, +[data-page^="admin-services-openclash"] select#RELEASE_BRANCH { + width: auto; +} +[data-page="admin-vpn-passwall"] h4 { + background: transparent; +} +/* openvpn bug fix */ +.OpenVPN a { + line-height: initial !important; +} +/* wireless overview */ +#cbi-wireless > #wifi_assoclist_table > .tr { + box-shadow: inset 1px -1px 0 #ddd, inset -1px -1px 0 #ddd; +} +#cbi-wireless > #wifi_assoclist_table > .tr.placeholder > .td { + right: 2rem; + bottom: 2rem; + left: 2rem; + border-top: thin solid #ddd !important; +} +#cbi-wireless > #wifi_assoclist_table > .tr.table-titles { + box-shadow: inset 1px 0 0 #ddd, inset -1px 0 0 #ddd; +} +#cbi-wireless > #wifi_assoclist_table > .tr.table-titles > .th { + border-bottom: thin solid #ddd; + box-shadow: 0 -1px 0 0 #ddd; +} +#wifi_assoclist_table > .tr > .td[data-title="RX Rate / TX Rate"] { + width: 23rem; +} +/* samba */ +#cbi-samba [data-tab="template"] .cbi-value-field { + display: block; +} +#cbi-samba [data-tab="template"] .cbi-value-title { + width: auto; + padding-bottom: 0.6rem; +} +/* fix status */ +.node-status-overview > .main fieldset:nth-child(4) .td:nth-child(2), +.node-status-processes > .main .table .tr .td:nth-child(3) { + white-space: normal; +} +div[style*="display:grid;grid-template-columns:repeat"] { + display: flex !important; + justify-content: space-evenly !important; + flex-wrap: wrap; +} +div[style*="display:grid;grid-template-columns:repeat"] .ifacebox { + text-align: center; + flex-basis: 100px; +} +div[style*="display:grid;grid-template-columns:repeat"] .ifacebox .ifacebox-body { + font-size: 0.7rem; + padding: 0.875rem; +} +div[style*="display:grid;grid-template-columns:repeat"] .ifacebox .ifacebox-body .cbi-tooltip-container { + font-size: inherit !important; +} +/* firewall */ +#iptables { + margin: 0; +} +.Firewall form { + margin: 2rem 2rem 0 0; + padding: 0; + box-shadow: none; +} +#cbi-firewall-redirect table *, +#cbi-network-switch_vlan table *, +#cbi-firewall-zone table * { + font-size: small; +} +#cbi-firewall-redirect table input[type="text"], +#cbi-network-switch_vlan table input[type="text"], +#cbi-firewall-zone table input[type="text"] { + width: 5rem; +} +#cbi-firewall-redirect table select, +#cbi-network-switch_vlan table select, +#cbi-firewall-zone table select { + min-width: 3.5rem; +} +#cbi-network-switch_vlan .th, +#cbi-network-switch_vlan .td { + flex-basis: 12%; +} +#cbi-network-switch_vlan .table { + display: block; +} +#cbi-network-switch_vlan .td { + width: 100%; +} +#cbi-firewall-zone .table { + display: block; +} +#cbi-firewall-zone .td { + width: 100%; +} +[data-page^="admin-system-commands"] .panel-title, +[data-page^="command-cfg"] .mobile-hide, +[data-page^="command-cfg"] .showSide { + display: none; +} +#mwan3-service-status { + display: flex; + justify-content: center; + align-items: center; + flex-wrap: wrap; +} +#mwan3-service-status > .alert-message { + position: static; + transform: none; +} +/* responsive */ +@media all and (-ms-high-contrast: none) { + .main > .main-left > .nav > .slide > .menu::before { + top: 30.25%; + } + .main > .main-left > .nav > li:last-child::before { + top: 20%; + } + .showSide::before { + top: -12px; + } +} +@media screen and (max-width: 1600px) { + header > .fill > .container > #logo { + margin: 0 2.5rem 0 0.5rem; + } + .main-left { + width: calc(0% + 13rem); + } + .btn:not(button), + .label { + padding: 0.5rem 0.75rem; + } + .cbi-value-title { + width: 15rem; + padding-right: 0.6rem; + } + .cbi-value-field .cbi-dropdown, + .cbi-value-field .cbi-input-select, + .cbi-value input[type="text"], + .cbi-value input[type="password"], + .cbi-value textarea { + min-width: 18rem; + } + #cbi-firewall-zone .cbi-input-select { + min-width: 9rem; + } + .cbi-input-textarea { + font-size: small; + } + .node-admin-status > .main fieldset li > a { + padding: 0.3rem 0.6rem; + } +} +@media screen and (max-width: 1366px) { + header > .fill > .container { + cursor: default; + } + .main-left { + width: calc(0% + 13rem); + } + .tabs > li > a, + .cbi-tabmenu > li > a { + padding: 0.2rem 0.8rem; + } + .panel-title { + font-size: 1.1rem; + padding-bottom: 1rem; + } + table { + width: 100% !important; + } + .table .cbi-input-text { + width: 100%; + } + .cbi-value-field .cbi-dropdown, + .cbi-value-field .cbi-input-select, + .cbi-value input[type="text"], + .cbi-value input[type="password"] { + min-width: 16rem; + } + #cbi-firewall-zone .cbi-input-select { + min-width: 5.5rem; + } + .main > .main-left > .nav > li, + .main > .main-left > .nav > li > a, + .main .main-left .nav > li > a:first-child, + .main > .main-left > .nav > .slide > .menu, + .main > .main-left > .nav > li > [data-title="Log_out"] { + font-size: 0.9rem; + } + .main > .main-left > .nav > .slide > .slide-menu > li > a { + font-size: 0.875rem; + } + #modal_overlay { + top: 0rem; + } + [data-page="admin-network-firewall-forwards"] .table:not(.cbi-section-table) { + display: block; + } + [data-page="admin-network-firewall-forwards"] .table:not(.cbi-section-table), + [data-page="admin-network-firewall-rules"] .table:not(.cbi-section-table), + [data-page="admin-network-hosts"] .table, + [data-page="admin-network-routes"] .table { + overflow-y: visible; + } + .btn:not(button), + .cbi-button { + font-size: 0.875rem; + } +} +@media screen and (max-width: 1152px) { + header > .fill > .container > #logo { + display: none; + } + header > .fill > .container > .brand { + position: relative; + } + html, + .main { + overflow-y: visible; + } + .main > .loading > span { + top: 25%; + } + .main-left { + width: calc(0% + 13rem); + } + body:not(.logged-in) .showSide { + visibility: hidden; + width: 0; + margin: 0; + } + .node-main-login > .main .cbi-value-title { + text-align: left; + } + .cbi-value-title { + width: 12rem; + padding-right: 1rem; + } + .cbi-value-field .cbi-dropdown, + .cbi-value-field .cbi-input-select, + .cbi-value input[type="text"] { + width: 16rem; + min-width: 16rem; + } + .cbi-value input[name^="pw"], + .cbi-value input[data-update="change"]:nth-child(2) { + width: 13rem !important; + min-width: 13rem; + } + #diag-rc-output > pre, + #command-rc-output > pre, + [data-page="admin-services-wol"] .notice code { + font-size: 1rem; + } + .table { + display: block; + } + .Interfaces .table { + overflow-x: hidden; + } + #packages.table { + display: grid; + } + .tr { + display: flex; + flex-direction: row; + flex-wrap: wrap; + } + .Overview .table[width="100%"] > .tr { + flex-wrap: nowrap; + } + .tr.placeholder { + border-bottom: thin solid #ddd; + } + .tr.placeholder > .td, + #cbi-firewall .tr > .td, + #cbi-network .tr:nth-child(2) > .td, + .cbi-section #wifi_assoclist_table .tr > .td { + border-top: 0; + } + .th, + .td { + display: inline-block; + align-self: flex-start; + flex: 2 2 10%; + text-overflow: ellipsis; + word-wrap: break-word; + } + .td select, + .td input[type="text"] { + width: 100%; + word-wrap: normal; + } + .td [data-dynlist] > input, + .td input.cbi-input-password { + width: calc(100% - 1.5rem); + } + .td[data-type="button"], + .td[data-type="fvalue"] { + flex: 1 1 12.5%; + text-align: left; + } + .th.cbi-value-field, + .td.cbi-value-field, + .th.cbi-section-table-cell, + .td.cbi-section-table-cell { + flex-basis: auto; + padding-top: 1rem; + } + .cbi-section-table-row { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-between; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 2px 0 rgba(0, 0, 0, 0.12); + } + .td.cbi-value-field, + .cbi-section-table-cell { + display: inline-block; + flex: 10 10 auto; + flex-basis: 50%; + text-align: center; + } + .td.cbi-section-actions { + vertical-align: bottom; + } + .tr.table-titles, + .tr.cbi-section-table-titles, + .tr.cbi-section-table-descr { + display: none; + } + .tr[data-title]::before, + .tr.cbi-section-table-titles.named::before { + font-size: 0.9rem; + display: block; + flex: 1 1 100%; + border-bottom: thin solid rgba(0, 0, 0, 0.26); + background: #e9ecef; + } + .td[data-title], + [data-page^="admin-status-realtime"] .td[id] { + text-align: left; + } + .td[data-title]::before { + display: block; + } + .cbi-button + .cbi-button { + margin-left: 0; + } + .td.cbi-section-actions > * > *, + .td.cbi-section-actions > * > form > * { + margin: 2.1px 3px; + } + .Firewall form { + position: static !important; + margin: 0 0 2rem 0; + padding: 2rem; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 2px 0 rgba(0, 0, 0, 0.12); + } + .Firewall form input { + width: 100% !important; + margin: 0; + margin-top: 1rem; + } + .Firewall .center, + .Firewall .center::before { + text-align: left !important; + } + .btn:not(button), + .cbi-button { + font-size: 0.875rem; + } +} +@media screen and (max-width: 768px) { + body { + font-size: 0.875rem; + } + .cbi-progressbar::after { + font-size: 0.6rem; + } + .main-left { + position: fixed; + z-index: 100; + width: 0; + } + .main-left.active { + width: 13rem; + } + .main-right { + width: 100%; + } + .main-right.active { + overflow-y: hidden; + } + .darkMask.active { + display: block; + } + .showSide { + padding: 0.1rem; + position: relative; + z-index: 99; + display: inline-block !important; + } + .showSide::before { + font-family: 'argon' !important; + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + content: "\e20e"; + font-size: 1.7rem; + } + header > .fill > .container > .flex1 > .brand { + display: inline-block; + } + .main > .main-left > .nav > .slide > .slide-menu > li > a { + font-size: 0.875rem; + } +} +@media screen and (max-width: 600px) { + .mobile-hide { + display: none; + } + #maincontent > .container { + margin: 0 1rem 1rem 1rem; + } + .cbi-value-title { + text-align: left; + } + .cbi-dynlist p { + padding: 0.5rem 1rem; + } + body { + overflow-x: hidden; + } + .node-main-login .main .main-right #maincontent .container .cbi-map .cbi-section .cbi-section-node .cbi-value .cbi-value-field { + width: 16rem; + } + .node-main-login footer { + display: none; + } + .tabs::-webkit-scrollbar, + .cbi-tabmenu::-webkit-scrollbar { + width: 0px; + height: 0px; + } + .cbi-value-field, + .cbi-value-description { + display: block !important; + padding-left: 0 !important; + padding-right: 0 !important; + } + [data-page="admin-system-admin-password"] .cbi-value-field { + display: table-cell !important; + } + .modal.cbi-modal { + max-width: 100%; + max-height: none; + } + .modal { + display: flex; + align-items: center; + flex-wrap: wrap; + width: 100%; + min-width: 270px; + max-width: 600px; + min-height: 32px; + margin: 5em auto; + padding: 1em; + border-radius: 3px !important; + background: #fff; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 2px 0 rgba(0, 0, 0, 0.12); + } + .cbi-dropdown[open] > ul.dropdown { + margin-bottom: 1rem; + } + .login-page .login-container footer { + display: none; + } +} +@media screen and (max-width: 480px) { + .mobile-hide { + display: none; + } + div[style*="display:grid;grid-template-columns:repeat"] .ifacebox { + flex-basis: 80px; + } + div[style*="display:grid;grid-template-columns:repeat"] .ifacebox .ifacebox-body { + padding: 0.875rem 0.5rem; + font-size: 0.6rem; + } + .login-page .login-container { + margin-left: 0rem !important; + width: 100%; + } + .login-page .login-container .login-form .form-login .input-group::before { + color: #525461; + } + .login-page .login-container .login-form .form-login .input-group input { + color: #525461; + border-bottom: white 1px solid; + border-bottom: var(--white) 1px solid; + border-radius: 0; + } +} +@media screen and (min-width: 600px) { + ::-webkit-scrollbar { + width: 10px; + height: 10px; + } + ::-webkit-scrollbar, + ::-webkit-scrollbar-corner { + background: transparent; + } + ::-webkit-scrollbar-thumb { + background: var(--primary); + border-radius: 10px; + } + ::-webkit-scrollbar-thumb:hover { + background: var(--primary); + } + ::-webkit-scrollbar-thumb:active { + background: var(--primary); + } +} diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/css/dark.css b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/css/dark.css new file mode 100644 index 0000000..fc36987 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/css/dark.css @@ -0,0 +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 diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/favicon.ico b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..79c8f860a65033885c496c6c15998e2cf885df74 GIT binary patch literal 9662 zcmeI2TXPge6vrp!gAYDh<+D}MDj)e6`4q|>xg{Y9ggfDqKmsKo8v|0|qKL>%3Y8Th z`_Q zSaR(`HMzD?SZZCPnzJUPO{%t@tyx%lL$jLRut-=2X{M8{Mb)KsVZWPfV#S31Y8a9qby4Q*NzxAP5@SU0_^^odqkG9vPf=#~ z=E;r^&_9P6h_y>A=UIyLICSBABFiGVF$a%zehkLoxAJsxt$FE3O7|?KD#y6I{y9_$ zLt^V{%07KOp(DR%#iIe^bTe7Wg!8(wCzR>kPz{6nd^z8L)?Xe&e8+ldh&wdMj1+#C z^NrGWNblSzPjjTqmHD`*QU;+P40-+j4Dl^1$cm0T>MqVmpFCL5U-~TR;UmSTI`*wZ zj4~gttAqjiXEOr@GGIPo+`r?fvou5h=>lQi>dIi=xLkU=<2d`*T}pShmdlXWKU?Vc zW6;7!9d)^77&oqX&RfmfzqnoE$TQBID7RlypDpA2&-%R?BAEYLDd&6Vs2CaA@%^52 z@61=9yItbQ^b^5rY4!4X9`qLPm9dG}kk&H`&ZkIapjDeFv zKl>0qeQRF-Eb?P8M@Jmxmu93ucSI?M2Z)Ul;}|5?8~Lv-63N7D#fyCN&%5@y zH~ir2_;bfK7V_eFmW%t=?8rmMdBqvVg@GV{S{)VlpY^*lWUgH-F4D1|K6l18_fBFS z=e22vcH5pM9djSQ&AdJg{k|~)b+mmZGvxI<8T8+-`&B{OcVCKmpPciheELZ3>qEA_ zRmU9EZ!>TG92D1p{u#_bUJRLEuliL%>A};sd277SdybRb)otrr_2D0U%QkOb75aT* zGwM^Je+GFmXcztK(C^$V=$HOO=JGj*F8%V5BQ|3O%ts8A6A)h#`oRGG?hMIq4m-5i zGE9TUJKO9Gh-0LV?IRs+$Cg4L7Ug(MQG6-BWx36Fu$7rV$Y9(Ih>@vJm&{-W@?wbW z>~<^KmX|(1P?7(@9Qu{>wldrfwEho*;(X9Qof(9FR|d?BtW?si_=!A>0r5|J%VtO& z?w`2UV~^`hqVEZaRjN;f{^{h$ps}AAwBb2Q9Niblpus;N(+nz&^x;7<2QT%3O5O+c z$>QnE0R7$!FUojUr6A+(EsB5AOA*9*r9U0zc<;fT@E?Acr}?L7&lJXRFF&q`0s5yg z0|hZ?0b`9rP&P|h_-ff$gb4eUZ2FZU+c;h7#}&QP>WI)kje;1SAugVUfBtW87I+ig z?Y42+ryYcTFhGAW!}#tk72nH>c=28&_inR|amDi`mv&G`+NLrCmCF!2yeF{Vu1K>y z8PB|ixK@Sh59(vq-!@g~FP9;TchNEoS@YymL#Gtxc2%rD2>oE7N*P{kUrVM-469NY zE+ZaVZ}T6D$7ye0RK)oT`m13WMa(O4>PS`ZHTMN6TpPhU+a%T>)JLuFF#}1fv>kZf z`V8wIF|>c?<~6d?nr9R6Z#vFNe9=!4#7X7&Am`pytUn0-U?}LXsvU~`2gJh0H!r7X z|5l0}=%e^&eH7cXmBtafdyaLIN@A5|yblHa|0sixKkXMItD+s$M=kG$S-Uj(98J0% z{u_qy!#)fxmSS-$FopJ#4Io82DQU+cyw-hFWL` z{?@^!U4F{}27Z?Knc{bv`z6`G%5hqx`8l7QdrKck`l2!>AY(H!MkZsGGG@$iZ@K=! zYbe5U>xp7bQLgQB%4_WWodAF9VEcaNK8t@Jw^ L`+T2M-1ol$(!Z#6 literal 0 HcmV?d00001 diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/fonts/GoogleSans-Regular.woff b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/fonts/GoogleSans-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..ddd21225b7720bd2e7bd26486abb744ab8e36b91 GIT binary patch literal 82968 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 O(N~+dMS$sPZ7%`cFhZ{Y literal 0 HcmV?d00001 diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/fonts/GoogleSans-Regular.woff2 b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/fonts/GoogleSans-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..64b6ac6a715fd7045e064f3c2a0ff5655cab6dfe GIT binary patch literal 56744 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 literal 0 HcmV?d00001 diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.woff b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.woff new file mode 100644 index 0000000000000000000000000000000000000000..fef38ca003e3d02372d80287057424843e6bd4f0 GIT binary patch literal 17816 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 P{|_V(EFb^?vO@>^k62-U literal 0 HcmV?d00001 diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.woff2 b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2b8ff0cb32f33ae9066f739c7f497b24dbb20d95 GIT binary patch literal 14616 zcmV+zIp@ZAPew8T0RR91067={5&!@I0E8?6064Dz0RR9100000000000000000000 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 O==J0?>s|sL0001bGDzeA literal 0 HcmV?d00001 diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.woff b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.woff new file mode 100644 index 0000000000000000000000000000000000000000..ef1e9c2c434f786a409d2e3ac47a5035872e98e7 GIT binary patch literal 8808 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 b$ejqMF;>UORRG?q5=PhE&nt)jo%sI(Ce#aG literal 0 HcmV?d00001 diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.woff2 b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..f38c5242e3eecfa4be878474e94c211076cd8c7a GIT binary patch literal 4804 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 literal 0 HcmV?d00001 diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/android-icon-192x192.png b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/android-icon-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..7bfe4e5fd41adaaca4360fe28ff088f4ea4c660d GIT binary patch literal 8300 zcmcIqdpwi<-`~h7X9^i@h{$1M=CERl5;>E@?Ks;=*p~Atb4a^OMX4L5R8&e1Ic!l5g%vTHd9GFW{XDPd^*q1l_s`??ntiY9dSCC)@%!=leqK(wIN3^WR^AK( zfh6q?+PDGVH2z0a82Ifr5+MS7iIETbM1w%$^861Nbh$_g1QO~9^YD)Gc631FNRb9u zJSmu9kPt}*&>+wrOad8;3n#?Df(fBvL<{wW$1UoxFuaAj7s?UgNVX;%2|Jh+MQ~4Y z^1vm9n7IK$ABR97V1`Ij13cCkYf3=r!Hf__MsPzzxRI$o!W@l6p%F;f?;mwQUKBnA z?Phb}w>03&Lj6cg3>giF$H&JT#3KzzQK4`{b8~Yz!U%3;qz@qUqZ5fS*aUrIw8q~I zHiT$gR2VrXj6{U-8L`2n*cc0SK-XVJM3VoZB}V^t6yP#=0+tLnG(hl;`Wxuz_^+Xn zk^i8hWA?`ZQhw|EKN3fKB$5emH$pTiHVQ}BA4ed@X#6b^Y|ZY$Y|>*0yc&e?cEsoyED=Yrv$0SIlrjhl!=nwcSTiIp7_V<^M8N8spp5bQSe$W)J`!n$ zMVX>Zv4&=*KlK9Mw;|zT`R?Pt|0{9vBpkr;kB88BB*HMnEZ9^Zk02oQO%TTB`dBOq zua7h`H8e)y&F}=A+23r=QDMN|!AAU7R=!qvfYI0p5n_rmGtoCU3o+9-#u+2^v4$o% z{SY$~vtT?P8A8Al)M0oWI)oGzi3Rc`ED{?^fRl-#>ahRR#+npCigG030iPrJ*$l7) zRvZkA211wkdw;kSj{ROmgu#9$9U6<{=emVDjvr(KUj6s&u>Zk(|DK+|XycC%0MdUE z{9mwWQbVhsvCw3%GnMI#lOqsGE zgJVq&Y}qfHDJr~)e)G%0p_Sv*9Xpym2OhWBd)>(kcoRPAJFt@6ICJ}PIeLbd@|ick z{5a#LHm&Vah1^#vOf+matFP*6Yu=??qrZw0VNG+kPUELW6ml;(pDy`WBbqx@wZpi1 z=Z-|bXB##Y^+Mc--JWTUJzBLX4oeeqdk!Rfq;1NP|FF8XEUI)AP$PPblP>t zmUjceqFaWn_B_w|I88NKtzsyR0#J#cr3P1@YFnoAI|$Bx+t zG2?#92$XlaGHto=ivH+`TCW~obSWTu&PO&p&FV{z7sawXk3l-XsoP0zwO`ptuCXEp z2wptKG3RPgp~bUuK^FIA_hbTAo0@a6_si9KkyXWQQwHF`mu)Ol3|HIF=j}XY0~z@G zXqp^Ajyc4n3co%4DO0W2`}gI6Pnp6lHKt^Ma##R!H0X$AZw|oMqt5xNxt<{`IyuK; zM{{a~Qa$eUDqm0g^(eC|T)2ITe_xabTf7WTc(hN7V$zx;ZMIL626!M;p4*zNz?T4F zDSkkL_^t}z_#%ETh#Z^}pNFsCc}A5q*IWwxE!ys7P1>kISq?f{`CN1pWI2Vswx!W$ zr*-62fq*JHs|UfAm7uYlg?N4fG5P1zW9EahoaXNL*4J$%hDD~oZS$0=$j#--(FQ)t z=@|Jv)nYVd%M~@-bO`AjQIet@Wt#$8U|c!AiayvNC}e2{n>jYRf4bLXZwKzU;iSjh z%hh+bW>Z<6aw_IC)RNLKyFXB8|0rY>Z{n&6GubbqO}J;0;nr3~|P_b%i zihsS7k78~X%deN$h!~kaY`s&8;)eoJTbd#!KUjY76mfW>VJms;%+31JSLp|6QS1Wf zu7<=Q+e^~;LI!lk`#fXZV<`8k%Vj|V?y8I55wJ!%1@5XZ?bTTwl1D9Q72ghcOHr;8 z+$G(@FrZmX6d@9yAcri%6tF|f(_3~r6cz|#B9>^EUu|cv!a9NQpwgOH4Y}D||B@m^ zou1d+9n+d`?c*!VQkBN=TEULN#sTHMt`8M?W)eX}&Y`t;L2Lafbv>3>JPP16`Mx5= z(|)N#o{cQF7{!x5o&oL>r|i8Zw7vMUNW4U}m5F%rxq#!A(k63kdcN)`Rxl!jia7~@ zHs-8V5V$|Cp*7RX_u@{z$C5D+y+42rA+`2UAXV)VxJwLU5>>o|nX~OY<5Z5ELbI8M zqDjPex|-fHkMEM zHIi;JYT48*tB`bPsGH@AcY4zIDSJohi{||^TZ;|i({~h#^R$E!;@pI~jnSGc#P$5M zeOI*3K7DmtN-p)uvs(u548^&vGVOZoi7h7w1DNd4eGSWsthQ}VMD zU2C(8`+FbnrefS@2lEP;I-!#$mtHd!=}GBlRF|JD#oT!0ouykd`<`L1{K7n_PFXco zO;)g49OD#n#iAsQYJom#MUuUi+%;UC+d*T$2m{ssSS?O~6+gQZ=X9%E*~H}pbv{-} z83-QDgq!!=oYn1`a#T?N(%A=$#`lpYvs#1%t0gff_vAReoY>;_7Uv#y-OH<7jg^B1 z)w4*4@oJI}1W>%Go4OGaEr?OEtW^c;R;Y%#!F#sG5)uke%Sds;=f5~L`=u5k$SvGg5;RM$|L)W5-W}UlYVL_F9J6{6r@){= zgF(xz7rj%%wu^})JqgLomtp6gyZm{K!`KJ=OR?Hn`SS_lRn9^9=h@e7o8|2zPo}k; z0(+l?%6nLloel1E!Y(H@sBZqY=@Wm?eJ?$nU`y0Jjmk%s1K%PLV@Y!zh> zNSiLx6&!36mT#6;K4^1u*Uh}L=hIhhnD?e&qJX5K**Q{ecxGX-{?SVH*EHGjX_kri zMolqy)To4Q+9UDeNM$!wYa4ROJkc{_^v7{Bv!Hlng{pbyEH~eDtmZuFwpYCD+R7HJ z_bEwqEz0vVbmPL0g@+7!8_|SCx}cKp%1MrwzfoFzOzY9WfNnLmT%`WXk_q19pcfVBgvCUtOAQys-|sU38RfC5R4a+roXc@JhHKn#Vn=mS zrft^v#90i;amOL#TkV}akFKXwKsuhA1?{^#Dr1+jaODV9n)fk8j;ADiU79i|r7khs zx%?;mBx>uGk?IVqndKAs!dJ|0J@3wx#Y~a6#AUk1%15gimwHUeg{O_L@-z>eQ%hot zB&U04LW>KH$6hWeX1|wPAAF+h{pigt2=~UiPGjEW_|ury$Ho1O0f-^k0^LE)y) zziJHoe*Czo!ydzs=$}-_*yESeN0pA1WPhvM?#-=ujO`PDZk*Hz;AP)~YFP_oJ|6J| zyj^41_a~H*6V22V2Rig#M}?(#ZP%+JFuI}PM5N6=2oE7xT`h*1?`prmKDzdGD)uO4 z&u4bHxLm`RrPhZ7U$U$lE_oMb@bhpu{c7Fwh5YfRpwLT$2zK}%{-=_KeheAWV7l&X z5lPx+u0Q(E-rEIN)hI02uPUu;^~Kg(V>D3-`IAM-7BjS(k-`7JC3pMieBu0d__o4 zK#<)~q~e9)xHgWw)_PMslBL#@uj_w19hwF4)%(%fc>+wvy60srZsAvh<1DW#i8H0B z@wy)IDY)J3^uXlcg}s=f$L$C7duz(G#5k_%;%w7?P=rKkh2K=S5;xH)-FRs~>TL24 z6NT>^W#~6=8*PHWPu$TQiXW1WC2Cf%#nUfG9=@e`Z5_4lx@@4T??8jLf?}9nn2SMA@*D!%@QQPa6~C~%<&y`oW#D@soe*r;O0J2*M4km zk9{MF+I?3|#-F1RanVsawQFbJ1J!k9<{kgBT6#{WGW5})So|0^=c)-}=`_CWH5noS zjmV6}B(gpa5ZOQaYIZ8t3)L@tXK>EPFdQQU%j)C^9P4+WC8lj%B;nRI_Gar7k;zZO zGNFqE9@f)x1hp%bbEW9CO7u?iWohK%K=iH6Ew?L@r=73V%WrH|5bbB>42zd4a?4CA zrgM1LEa7`2n=dGE40m>i!zZl=&)pq7sswLYOCi?m*`2%8t*7(}rN_Kc{&v4WET=@- z%9&HAoK`QTx^hP-RbnaxQz+6<>r{OASn=4nqV&HA|z7Pe8%}uW_-spmFZ#B`pNm>w#_S!i!uZCP4fwXyRz zFB)+xvh~Odja{!ot{Qh&YW3I)rS`Y!E?Hk6vT$9ajXwj`GD!%~s4^(o_NKm`b7}F$ z{Ojd2A<>NJan!Ew7EK0zA+5j$lP;97l~3I=$2IY)?36_|XbNDKgD**Saw9w)GJ_xN zkj7Y&&!+3i6<{u!a9NR{&Fl$56NtZH(0sQC(-!;5#A2U$O3wUjS>iXy8*F}6c9e6j zW2rR7UC<>1)BU9Nkut2X$)ezy7d&>S?Tho1tuEwIp@Ao^y!~iCBQ4-p z<*5yrk5tj;92WG;>*xM3&bn&Vc*MeogPH?c>BEpWn1|Gt#1+*`KuBWW!`5a(kJ@pe zO%v9EoJ`^CVi3-mQPknIXViCH@<3JXooN9$LyZ%eccsMG#zU1Ah3 z<`1V~qBOiiIdv>{jpB^6)6A&91o192ialp#Byk8s%~{6_YT7sFV}gee^+*qasTzNaa1=}lf=RKLgAO!u3jS^G*G z7U{ix+THk?n#Jz(d7F`J+j*gzn=rHaf?vLT%p9J*?flBnnCtm%&T_rl+Hrq-hRpi9 zEnbVM_`xvk8hfHovFf1V;^MTvilS2dURI3;TU$m&$fG{U0pP2ACQn$ zVWC@neUqJ9Fw|NR8%8VU{Im55+tUum|9ULl?$8S4b}cjXHK-sb`t5|%^fukkf;e{0 zlfxcWy!$ixnMUqxTVs$T=c}xWtYxfI@N71ta@gxy+`a{(=O-3iRh{lGJ-p3lX{-!) zhtL@1j}=W-8v$z7AQ3oEfWr65bLR{Flq|jR3OqYpqys(Y-4pi^DWJO#0%~A=V2W%_ z-D`z&Ov{Y|cUA2g;4eNjIq}+ho#1xu8gTZ#c)>64;D#cUUXWgE4qcX2k(@%ihd8v@ zHRB|3%}Ogv(=!B96`8yvm;0p^+9d0+E!DAHcU0$9X;FO}?bXMy*7@~_K>;NJ$7?}@TT{7jZadT(QjQHZ2cCNfk%X|R{h%+cRn3#14-@?t ziCQH$1ovzIS^H*}AbVmXDW(nqU1NS&-x|K|zyM6@lHn#SeAv3}?fN8kt@C;6%7v#l z4cI02YY$b|uJ5vActJS9vb;$x#*9RZmY=Whf?ENP{y467T7WW?Y^dGEslNB7XAjqq z-!y6a8GawwRS$XAmX!f;cn^8+`Kx2_ATz2)n&Kf?y{Tn++;R642mONA<*kqzZ(W9L zFH7EtTYJa|#NCG%tQN&=7HQ*strLF|U}AlPtxq))#B@wx7m+mMmEucOgHNG9o4m~} zT3u(GF1~gt3+v`}wdMq4OFkc5i#vVnl1(X5Mx183Bs5p3S}+RU@;X-rg6jO0?~lG%}LLJY}|v)k}~o{z!Mu|6ygQ z#5GJxA371p5RX?}okl7meUAsot9joJf%B76>rOB+al5onS)DCso(g9MZILmJ$&l8f)b?^o>E>*$sn zENR0uL)KtzLersFkL|37*0&uSACsWx}n&86RSsD${7}l4`>z?3yIA z7{8514*8JR2ML;UjcQtx1!k3QtK1??4g7Oh9IwKGBx`I+pqv-KC-vD^Ughjo9$u8^ zqV)YFg%xV)wx|TKBi$a`>Mg%CNl=gq=8OgAJGGe3O&c?M>w0NRj%9mDvOYb=olW-0q_3b!nu zcBm61<5x<0jsso#gCDE7R%i$a*;*wQpSap55=;Kzu$Jr~wLPzlp0gpf-MIx!mVexm zGMROc@$fE-6bwSrt7ei=WxEY3N535MJ$S;uvXxUT$1Ovas;2$OzIEtIygeI3`A#2z zoSp$rsmHvy5D(O`bHj%Bc`kD_nP5uuWmaT6sQl5LN`_jQIQ!UxLjzc` zIL}px$%7D?R7W#|w7GQ0-S|dafspW0eHkPw+jFm@c~0~0WU2P*@WA$yBR&$8K4sV; zmb5=UBNrF8>b=aAJ}wl%@*-XAmm5DeEJnd;n02xSlMN4Pv7EWO9RZw@B?11N^b^FK$WLp{GR z30=Gcf}+*ue?4)9Scj+Wa;xOa_YuHg{mV8hGn<>*8jWj<_y_^c*MQYxp0@T46zHfd zpIL})inZtmZ7nV0&tx5?HVQ$X9VM;kFbAncDZYil9M=V)DxC8WWFAt;E%pKi?WuY6 zoCvt+aYuQ(1Qk|LOTfZvpcWqBUKRyji<1t#MJ$#P~ zpWKia*jPM&Ztt?M{TYtZ5OCwYc8%iQJD%86w(N}}~_+lY4yqU>axMpNp zn%L~iSDD_I`1&0XOV0HXpd8Ph`g1_|NM-(bS)n6wOtY;Ocmw(FeWv8t%7i(!BUN2k zv>-?+u_tSCUKG%)SdH_bm=aPub`1|{#a>?VRC~HtN2kh)(Q5>_$620N4pulMpN_dJ zqkZ3`z&&rUw?iRdXXrE?p#3b0>7GrYUKDzD$8?9AU@0EtSk-m6?Q-dvi`z=Mr!Us? zqYfOZFZm5U&Rks8RX_X1&Cm*oWWKaNxb0Af)wlR%jfSfSbzqvsT(A_N4CZ9DTDDy| zf+T(0z8yg=U-jH6oS9WExY*dy1{{VLToop)i1!epPzA`;) literal 0 HcmV?d00001 diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-144x144.png b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..8d523df8b3def104ea6bc7e6fa1e41803aea18cb GIT binary patch literal 6568 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 literal 0 HcmV?d00001 diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-72x72.png b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-72x72.png new file mode 100644 index 0000000000000000000000000000000000000000..07753022e45a769c7a35fd2fb59b25577e4d9734 GIT binary patch literal 4003 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 literal 0 HcmV?d00001 diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/arrow.svg b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/arrow.svg new file mode 100644 index 0000000..a20e798 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/browserconfig.xml b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/browserconfig.xml new file mode 100644 index 0000000..c554148 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/browserconfig.xml @@ -0,0 +1,2 @@ + +#ffffff \ No newline at end of file diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-16x16.png b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..88bf329787747293b939c263e9d4b53e64b18238 GIT binary patch literal 2069 zcmcIleN5D57%v7tVB&~32P$f<#7t(dz4kskPX>20Bvx-2ep%GffUA9IFfVum40Hg(fD=hr}V(JbiPl*GM-<7O6h{Ig4XecS%t z-}8HZ&(o)Mxj9*Ju~T9Z1c`HHJM-W`u_Y!q>6RS8 zCuCR2AipZd!&Q}XHXcizkIoA*kRSk577YdbL4^s~u|Zx2uC?0)h7Lm1QahHW1w;$n zxu`>w0cz8eI7gBsYM?E8o;9)-V490kBt;Ph13_7E(#FsxhNRK(4}BdPMMZ_ag4T<231P6=Yy?RW6oo?su2cq9HiQS2S;GuYpm4Gvse%|pHAc2r zEK}_m)H;+zK#I@?m9SCJG9tuEgh5YgNeu(t?q@>-fe2brGsg`Imi)lhyiAc$xK;_ah9ey++s5taI2Lw;ILh- zHj*N(lot%MEtCcL?y&yHSv6HWWHeGHBg^qd+-o*)xY=Oja9gp#h|?s+b0*Sg1srsX z=NPXj2UyrALVzs+gcK~n(0|l8M87DzMIL%iYuyalVHVkf0!vpJen0ZT%J9lBpo2}v zu$$`VNo=G2*oBxXCy4!Q-d2Jt4htAaQ?Y&5VOZLPwtOZxwQr$GSU!3}7=w8AvnPg+q4{@goYnyK!n>?+&Z-rxW?OVE- zEn5y>Tvc$gzwXRk^@OUQ)^YCZ-aFGzo}7JdO`=u#{@1?O>i5p*PT5~xw2MXc$fec3_M<&C-R!NRy1R(e58ogA z>cvS9?{{Kn_Xf7#N~uzgN7cmCHaNzt_2iwo+1h-#&G$;lh54TxShgNXwl-|;_kY## z^TSDRj~lgeprByxxT4iH@8}90`_Ejy)|A`R_W6#ZjaN^7288oenJvvrdj9NdS$Hrr zvAsHBy8Wa4l(9&%uJv-VZsziR(etWrXSG+QzxmSxowTYgedVX$wu~l@-mU8Bz10Z* zSa)i1-FwEHod>$(_Sg&iF1&a?NByEzWDdN3FO_VJ&CHw7(6nv)_21$THO5XnvIeK? Vx9%dQ?bJTpu8bUKTYAy@zX6*N(Zv7& literal 0 HcmV?d00001 diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-32x32.png b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..d524df3eaee3fc2b0e70a5abd14fa2c4f134deab GIT binary patch literal 2604 zcmcImc~ld39#17ekfSOHE3IxER$GP1OfEn9_X?P?1XFk_O-76?7TUCGxPa=zMtFq$+WaRL%eIA3 zCDMt?NEu4%c?d?Tah^p_F=!SmV6KHiP#sQl)wqT*$brW-#{n*Z$$`^dxRwad zGU9PrQ7SY`he|PE?i_A_MaB^5aT?)T^l1i@%pwPdcxBAm`WOPZLl9ag2Li1Qxrxdc zZZK)Yxl$esqA(0|`9eP)hKLY9TVi_#tj%)zq&xobUVilny z-k3W%prvU_20>=CnP(RANTUYgOQli>7C-_4$RI#drh!H*puyxd%AmkasF9#(f;4cg zjEI`dpydFgbvOt;HAZVNjU5DAD0rLZp|mZYkE@gZG|y@EtDtm(7b4>vAGq727ahM4~2^Kqdd6;z8Q zVo)j&2|+1_i9oTGkK=q)jrhUXC|k6VV7?tB?YFE}RT#r40}6M?R7bTT8oS`dWRnqzmvVU(>ZK!*5VB58;U;+Gm)vZ z88PC48Ya{Kv$>!@5^qA5yjl9&75@JyeI%`@7BOgWW^_V;H5kY`Vup(X{dc{F-u-4A zjl!83XI+ksSLSAHK;s66+Q^LGl9g~3i^b+dC<0Z94UMJB$mDpp=1(7-E1zZK2s}VzXid z(E|?$o!ZVVSKwI6yAqCmcHFbx6<*<$y(yki?3UJX#ctm0vfQPw#oc%J&y;Ww9oX~N z&I$gXI9@q2LxD*AJ3jx%>gMQ#_GQn4*KhxLshDEdB{>IpejL!NUEQ^7LSF^!b5OKa zOSq)(nS1ut*1weH9{}Dzab()ExHXNR>30@~x_y)1wTml`cPDE-H0qXC$1wKylWJ>y zPSj=Vax`8^Ky6RtM11FLD4A9A?q2o_`J$j5+U}k-#roA6v&XiRPGM~Cl!hDGVej-_ z+L(SvH+YzSc}5uU>$sTe)9R)3))lJHcU_LRzjEkOMRnWx+v5`Z4t3_dT$A53ub;R% z0H0fy73jZwpt0+b}u_Rq426SWy@v% zv;D%pwO`kj8X7j&ec`ZH(e9P}9i8&HR%26&y6pePx1o|pW)~#>-SyB#+bhcxVsbtx zoQ4*CW!JF@E}!}yZ(z6iKrFR5dV0Ce=j@{LpKX5mv|{nZLf50E3zHMpLPY)jzKeaC z?Zi=!Re_d&u5{j1J@=rO;zZ2AL1)czQy!JFGJq6Z=m?lIr$lu5!lCoEH`34KFMaA= z{%}eg$8UDQBkG37h0U)PL5;U}S5EcGIsVY^ha2~(?H#8bJKW%-q1n$v3X3#d9y-oR zyWX4`8_|#U+Hc)*K$_mUXrjyFZ`o}dw)FXi4DNIBPs+)Q&dSTHNxGFh^_e8SbJtV% z?KREFvX&ZNvZA0L>X$oR{4r<~ z182+6Ki$!K1U1V}_-}YWcA;Za-|JRk&4f-iq2S!wy~)M~pr=W99AORELemA2wM%FC QTmR=GLZTFVgBGv)H+k{kfB*mh literal 0 HcmV?d00001 diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-96x96.png b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..6c8e88740bf56d2ff5faa7f15ba2d3b0bd072f63 GIT binary patch literal 4805 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 literal 0 HcmV?d00001 diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/manifest.json b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/manifest.json new file mode 100644 index 0000000..d4b84f1 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/manifest.json @@ -0,0 +1,41 @@ +{ + "name": "Openwrt", + "icons": [ + { + "src": "\/android-icon-36x36.png", + "sizes": "36x36", + "type": "image\/png", + "density": "0.75" + }, + { + "src": "\/android-icon-48x48.png", + "sizes": "48x48", + "type": "image\/png", + "density": "1.0" + }, + { + "src": "\/android-icon-72x72.png", + "sizes": "72x72", + "type": "image\/png", + "density": "1.5" + }, + { + "src": "\/android-icon-96x96.png", + "sizes": "96x96", + "type": "image\/png", + "density": "2.0" + }, + { + "src": "\/android-icon-144x144.png", + "sizes": "144x144", + "type": "image\/png", + "density": "3.0" + }, + { + "src": "\/android-icon-192x192.png", + "sizes": "192x192", + "type": "image\/png", + "density": "4.0" + } + ] +} \ No newline at end of file diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/ms-icon-144x144.png b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/icon/ms-icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..8d523df8b3def104ea6bc7e6fa1e41803aea18cb GIT binary patch literal 6568 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 + + diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/img/argon.svg b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/img/argon.svg new file mode 100644 index 0000000..62f9a86 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/img/argon.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/img/bg1.jpg b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/img/bg1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..26a52a5351f3c68d326dcacbf98fe3cf9ac485a3 GIT binary patch literal 159265 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 z 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

Y2#d_pOEdAHz8x0cU)30N4^@W{p|L> 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�$dl3gH)Q&OCfV6T};Oqr8= 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 J%do#+{vV8|Vut_# literal 0 HcmV?d00001 diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/img/blank.png b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/img/blank.png new file mode 100644 index 0000000000000000000000000000000000000000..9f4100e6e2ea2fa08912439eb7425af3f048eedd GIT binary patch literal 938 zcmaJ=L66cv6t0pOLtGQRxu;1t8cn3rmX@UxDuEV+#1g`iEC&ykc7V#ZQ`^B74o1E0 z!9@RtCjJ4Vo;`W;;-Byjn5vqfmTeG-$ z^$PpHk-vXt%Pra((IYaUi5+3C;gT^1UEiMK0k+-cvv0V@afLhHa70JeBjgZYurrL1 z`XOU;T&;m#;qnwG=S{ zA5$Bo{z(v{ROi>ah{f44|Y zg;KdBRgfYgSq7VrXW1fmf(B-LlZ)+ienx4CAWV`(NXi0_9I4~G;sIW3tW=K z_tqTCLfs&ycHrQysq;)l@H`ilE0WPRn-#+l6-jC}G^uPDimIwwvsqP|M$R>fv+!|1 zbFO>AJ>1F7#=#F+W)nx=bL_Sw;)8YB$lL8j*{QeTy1TuoJGqdVf!XE$b=mn5o1iS* zjxO75haU%Q;v+WNFFxG9&Ys17*K7>apX1+WXZ3>g^7K_leE${|FI~RI{kU1U@$}2P Q$Jy)YwtD8r=9AZd04Jv&d;kCd literal 0 HcmV?d00001 diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/img/volume_high.svg b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/img/volume_high.svg new file mode 100644 index 0000000..ef84c3c --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/img/volume_high.svg @@ -0,0 +1,3 @@ + + + diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/img/volume_off.svg b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/img/volume_off.svg new file mode 100644 index 0000000..5467d4d --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/argon/img/volume_off.svg @@ -0,0 +1,3 @@ + + + diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/resources/menu-argon.js b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/resources/menu-argon.js new file mode 100644 index 0000000..3f4dd67 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/htdocs/luci-static/resources/menu-argon.js @@ -0,0 +1,448 @@ +'use strict'; +'require baseclass'; +'require ui'; + +/** + * Native JavaScript slide animation utilities + * Replaces jQuery slideUp/slideDown functionality with better performance + */ +const SlideAnimations = { + /** + * Animation durations in milliseconds + */ + durations: { + fast: 200, + normal: 400, + slow: 600 + }, + + /** + * Map to track running animations and their cleanup functions + */ + runningAnimations: new WeakMap(), + + /** + * Slide element down (show) with animation + * @param {Element} element - DOM element to animate + * @param {string|number} duration - Animation duration ('fast', 'normal', 'slow' or milliseconds) + * @param {function} callback - Optional callback function when animation completes + */ + slideDown: function(element, duration, callback) { + if (!element) { + console.warn('SlideAnimations.slideDown: No element provided'); + return; + } + + // Stop any existing animation on this element + this.stop(element); + + // Convert duration string to milliseconds + const animDuration = typeof duration === 'string' ? + this.durations[duration] || this.durations.normal : + (duration || this.durations.normal); + + // Store original styles + const originalStyles = { + display: element.style.display, + overflow: element.style.overflow, + height: element.style.height, + transition: element.style.transition + }; + + // Set initial state for animation + element.style.display = 'block'; + element.style.overflow = 'hidden'; + element.style.height = '0px'; + element.style.transition = `height ${animDuration}ms ease-out`; + + // Force reflow to ensure initial state is applied + element.offsetHeight; + + // Get the target height + const targetHeight = element.scrollHeight; + + // Animate to full height + element.style.height = targetHeight + 'px'; + + // Set up cleanup function + const cleanup = () => { + element.style.height = originalStyles.height || ''; + element.style.overflow = originalStyles.overflow || ''; + element.style.transition = originalStyles.transition || ''; + + // Remove from running animations map + this.runningAnimations.delete(element); + + if (callback && typeof callback === 'function') { + try { + callback.call(element); + } catch (e) { + console.error('SlideAnimations callback error:', e); + } + } + }; + + // Store cleanup function for potential cancellation + const timeoutId = setTimeout(cleanup, animDuration); + this.runningAnimations.set(element, { timeoutId, cleanup }); + }, + + /** + * Slide element up (hide) with animation + * @param {Element} element - DOM element to animate + * @param {string|number} duration - Animation duration ('fast', 'normal', 'slow' or milliseconds) + * @param {function} callback - Optional callback function when animation completes + */ + slideUp: function(element, duration, callback) { + if (!element) { + console.warn('SlideAnimations.slideUp: No element provided'); + return; + } + + // Stop any existing animation on this element + this.stop(element); + + // Convert duration string to milliseconds + const animDuration = typeof duration === 'string' ? + this.durations[duration] || this.durations.normal : + (duration || this.durations.normal); + + // Store original styles + const originalStyles = { + display: element.style.display, + overflow: element.style.overflow, + height: element.style.height, + transition: element.style.transition + }; + + // Get current height before hiding + const currentHeight = element.scrollHeight; + + // Set initial state for animation + element.style.overflow = 'hidden'; + element.style.height = currentHeight + 'px'; + element.style.transition = `height ${animDuration}ms ease-out`; + + // Force reflow to ensure initial state is applied + element.offsetHeight; + + // Animate to zero height + element.style.height = '0px'; + + // Set up cleanup function + const cleanup = () => { + element.style.display = 'none'; + element.style.height = originalStyles.height || ''; + element.style.overflow = originalStyles.overflow || ''; + element.style.transition = originalStyles.transition || ''; + + // Remove from running animations map + this.runningAnimations.delete(element); + + if (callback && typeof callback === 'function') { + try { + callback.call(element); + } catch (e) { + console.error('SlideAnimations callback error:', e); + } + } + }; + + // Store cleanup function for potential cancellation + const timeoutId = setTimeout(cleanup, animDuration); + this.runningAnimations.set(element, { timeoutId, cleanup }); + }, + + /** + * Stop all running animations on an element + * @param {Element} element - DOM element to stop animations on + */ + stop: function(element) { + if (!element) return; + + const animationData = this.runningAnimations.get(element); + if (animationData) { + // Clear the timeout + clearTimeout(animationData.timeoutId); + + // Run cleanup immediately + animationData.cleanup(); + } + + // Clear transition to immediately stop any CSS animation + element.style.transition = ''; + + // Force reflow to apply changes immediately + element.offsetHeight; + }, + + /** + * Check if element has running animation + * @param {Element} element - DOM element to check + * @returns {boolean} - True if element has running animation + */ + isAnimating: function(element) { + return this.runningAnimations.has(element); + } +}; + +/** + * Argon Theme Menu Module + * Handles rendering and interaction of the main navigation menu and sidebar + */ +return baseclass.extend({ + /** + * Initialize the menu module + * Load menu data and trigger rendering + */ + __init__: function () { + ui.menu.load().then(L.bind(this.render, this)); + }, + + /** + * Main render function for the menu system + * @param {Object} tree - Menu tree structure from LuCI + */ + render: function (tree) { + var node = tree, + url = '', + children = ui.menu.getChildren(tree); + + // Find and render the active main menu item + for (var i = 0; i < children.length; i++) { + var isActive = (L.env.requestpath.length ? children[i].name == L.env.requestpath[0] : i == 0); + + if (isActive) { + this.renderMainMenu(children[i], children[i].name); + } + } + + // Render tab menu if we're deep enough in the navigation hierarchy + if (L.env.dispatchpath.length >= 3) { + for (var i = 0; i < 3 && node; i++) { + node = node.children[L.env.dispatchpath[i]]; + url = url + (url ? '/' : '') + L.env.dispatchpath[i]; + } + + if (node) { + this.renderTabMenu(node, url); + } + } + + // Attach event listeners for sidebar toggle functionality + var sidebarToggle = document.querySelector('a.showSide'); + var darkMask = document.querySelector('.darkMask'); + + if (sidebarToggle) { + sidebarToggle.addEventListener('click', ui.createHandlerFn(this, 'handleSidebarToggle')); + } + if (darkMask) { + darkMask.addEventListener('click', ui.createHandlerFn(this, 'handleSidebarToggle')); + } + }, + + /** + * Handle menu expand/collapse functionality + * Manages the sliding animation and active states of menu items + * @param {Event} ev - Click event from menu item + */ + handleMenuExpand: function (ev) { + var target = ev.target; + var slide = target.parentNode; + var slideMenu = target.nextElementSibling; + var shouldCollapse = false; + + // Close all currently active submenus + var activeMenus = document.querySelectorAll('.main .main-left .nav > li > ul.active'); + activeMenus.forEach(function (ul) { + // Stop any running animations and slide up + SlideAnimations.stop(ul); + // Remove active classes immediately when starting slideUp animation + ul.classList.remove('active'); + ul.previousElementSibling.classList.remove('active'); + SlideAnimations.slideUp(ul, 'fast'); + + // Check if we're clicking on an already open menu (should collapse it) + if (!shouldCollapse && ul === slideMenu) { + shouldCollapse = true; + } + }); + + // Exit if there's no submenu to show + if (!slideMenu) { + return; + } + + // Open the submenu if it's not already open + if (!shouldCollapse) { + // Find the slide menu within the slide element + var slideMenuElement = slide.querySelector(".slide-menu"); + if (slideMenuElement) { + // Add active classes immediately when starting slideDown animation + slideMenu.classList.add('active'); + target.classList.add('active'); + SlideAnimations.slideDown(slideMenuElement, 'fast'); + } + target.blur(); // Remove focus from the clicked element + } + + // Prevent default link behavior and event bubbling + ev.preventDefault(); + ev.stopPropagation(); + }, + + /** + * Render the main navigation menu + * Creates hierarchical menu structure with active states and click handlers + * @param {Object} tree - Menu tree node to render + * @param {string} url - Base URL for menu items + * @param {number} level - Current nesting level (0-based) + * @returns {Element} - Generated menu element + */ + renderMainMenu: function (tree, url, level) { + var currentLevel = (level || 0) + 1; + var menuContainer = E('ul', { 'class': level ? 'slide-menu' : 'nav' }); + var children = ui.menu.getChildren(tree); + + // Don't render empty menus or menus deeper than 2 levels + if (children.length === 0 || currentLevel > 2) { + return E([]); + } + + // Generate menu items for each child + for (var i = 0; i < children.length; i++) { + var child = children[i]; + var isActive = ( + (L.env.dispatchpath[currentLevel] === child.name) && + (L.env.dispatchpath[currentLevel - 1] === tree.name) + ); + + // Recursively render submenu + var submenu = this.renderMainMenu(child, url + '/' + child.name, currentLevel); + var hasChildren = submenu.children.length > 0; + + // Determine CSS classes based on state + var slideClass = hasChildren ? 'slide' : null; + var menuClass = hasChildren ? 'menu' : 'food'; + + if (isActive) { + menuContainer.classList.add('active'); + slideClass += " active"; + menuClass += " active"; + } + + // Create menu item with link and submenu + var menuItem = E('li', { 'class': slideClass }, [ + E('a', { + 'href': L.url(url, child.name), + 'click': (currentLevel === 1) ? ui.createHandlerFn(this, 'handleMenuExpand') : null, + 'class': menuClass, + 'data-title': child.title.replace(/ /g, "_"), // More robust space replacement + }, [_(child.title)]), + submenu + ]); + + menuContainer.appendChild(menuItem); + } + + // Append to main menu container if this is the top level + if (currentLevel === 1) { + var mainMenuElement = document.querySelector('#mainmenu'); + if (mainMenuElement) { + mainMenuElement.appendChild(menuContainer); + mainMenuElement.style.display = ''; + } + } + + return menuContainer; + }, + + /** + * Render tab navigation menu + * Creates horizontal tab menu for deeper navigation levels + * @param {Object} tree - Menu tree node to render + * @param {string} url - Base URL for tab items + * @param {number} level - Current nesting level (0-based) + * @returns {Element} - Generated tab menu element + */ + renderTabMenu: function (tree, url, level) { + var container = document.querySelector('#tabmenu'); + var currentLevel = (level || 0) + 1; + var tabContainer = E('ul', { 'class': 'tabs' }); + var children = ui.menu.getChildren(tree); + var activeNode = null; + + // Don't render empty tab menus + if (children.length === 0) { + return E([]); + } + + // Generate tab items for each child + for (var i = 0; i < children.length; i++) { + var child = children[i]; + var isActive = (L.env.dispatchpath[currentLevel + 2] === child.name); + var activeClass = isActive ? ' active' : ''; + var className = 'tabmenu-item-%s %s'.format(child.name, activeClass); + + var tabItem = E('li', { 'class': className }, [ + E('a', { 'href': L.url(url, child.name) }, [_(child.title)]) + ]); + + tabContainer.appendChild(tabItem); + + // Store reference to active node for recursive rendering + if (isActive) { + activeNode = child; + } + } + + // Append tab container to main tab menu element + if (container) { + container.appendChild(tabContainer); + container.style.display = ''; + + // Recursively render nested tab menus if there's an active node + if (activeNode) { + var nestedTabs = this.renderTabMenu(activeNode, url + '/' + activeNode.name, currentLevel); + if (nestedTabs.children.length > 0) { + container.appendChild(nestedTabs); + } + } + } + + return tabContainer; + }, + + /** + * Handle sidebar toggle functionality + * Toggles the mobile/responsive sidebar menu visibility + * @param {Event} ev - Click event from sidebar toggle button or dark mask + */ + handleSidebarToggle: function (ev) { + var showSideButton = document.querySelector('a.showSide'); + var sidebar = document.querySelector('#mainmenu'); + var darkMask = document.querySelector('.darkMask'); + var scrollbarArea = document.querySelector('.main-right'); + + // Check if any required elements are missing + if (!showSideButton || !sidebar || !darkMask || !scrollbarArea) { + console.warn('Sidebar toggle elements not found'); + return; + } + + // Toggle sidebar visibility and related states + if (showSideButton.classList.contains('active')) { + // Close sidebar + showSideButton.classList.remove('active'); + sidebar.classList.remove('active'); + scrollbarArea.classList.remove('active'); + darkMask.classList.remove('active'); + } else { + // Open sidebar + showSideButton.classList.add('active'); + sidebar.classList.add('active'); + scrollbarArea.classList.add('active'); + darkMask.classList.add('active'); + } + } +}); diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/cascade.less b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/cascade.less new file mode 100644 index 0000000..3c51757 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/cascade.less @@ -0,0 +1,2500 @@ +// out: ../htdocs/luci-static/argon/css/cascade.css, compress: false , sourceMap: false +/** + * Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material and Argon Template + * + * luci-theme-argon + * Copyright 2025 Jerrykuku + * + * Have a bug? Please create an issue here on GitHub! + * https://github.com/jerrykuku/luci-theme-argon/issues + * + * luci-theme-material: + * Copyright 2015 Lutty Yang + * https://github.com/LuttyYang/luci-theme-material/ + * + * Agron Theme + * https://demos.creative-tim.com/argon-dashboard/index.html + * + * Login background + * https://unsplash.com/ + * Font generate by Icomoon + * + * Licensed to the public under the Apache License 2.0 + */ + +:root { + --primary: #5e72e4; + --dark-primary: #483d8b; + --header-color: #fff; + --menu-bg-color: #ffffff; + --menu-color: #5f6368; + --main-menu-color: #202124; + --red: #f5365c; + --orange: #fb6340; + --yellow: #ffd600; + --green: #2dce89; + --teal: #11cdef; + --cyan: #2bffc6; + --white: #fff; + --gray: #8898aa; + --gray-dark: #32325d; + --light: #ced4da; + --lighter: #e9ecef; + + --success: #2dce89; + --info: #11cdef; + --warning: #fb6340; + --danger: #f5365c; + + --light: #adb5bd; + --dark: #212529; + --default: #172b4d; + --white: #fff; + --darker: black; + --background-color: #f4f5f7; + --login-form-bg-color: rgba(244, 245, 247, 0.8); + --blur-radius: 10px; + --blur-opacity: 0.5; + --blur-radius-dark: 10px; + --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=="); +} + +/* + * Include base and custom css + */ +@import url("fonts.less"); +@import url("normalize.less"); +@import url("pure-min.less"); + +// table + +.table { + position: relative; + display: table; +} + +.tr { + display: table-row; +} + +.thead { + display: table-header-group; +} + +.tbody { + display: table-row-group; +} + +.tfoot { + display: table-footer-group; +} + +.td, +.th { + line-height: normal; + display: table-cell; + padding: .5em; + text-align: center; + vertical-align: middle; +} + +.th { + font-weight: bold; + white-space: nowrap; +} + +.tr.placeholder { + height: 4em; +} + +.tr.placeholder>.td { + line-height: 3; + position: absolute; + right: 0; + bottom: 0; + left: 0; + padding: 0.4rem 0 !important; + text-align: center !important; + background: inherit; +} + +.td[width="33%"] { + padding: 1.1em 1.5rem; +} + +.table[width="33%"], +.th[width="33%"], +.td[width="33%"] { + width: 33%; +} + +.table[width="100%"], +.th[width="100%"], +.td[width="100%"] { + width: 100%; +} + + +.btn, +button, +select, +input, +.cbi-dropdown { + line-height: 1.5rem; + height: 2.5rem; + padding: .5rem .75rem; + color: #8898aa; + border: 1px solid #dee2e6; + border-radius: .25rem; + outline: 0; + background-image: none; + box-shadow: none; + transition: box-shadow .15s ease; +} + + + +select { + padding-right: 1.5rem; + background-image: url("data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBmaWxsPSIjODg5OGFhIiBkPSJNNS4yOTMgOS4yOTNhMSAxIDAgMCAxIDEuNDE0IDBMMTIgMTQuNTg2bDUuMjkzLTUuMjkzYTEgMSAwIDEgMSAxLjQxNCAxLjQxNGwtNiA2YTEgMSAwIDAgMS0xLjQxNCAwbC02LTZhMSAxIDAgMCAxIDAtMS40MTQiLz48L3N2Zz4="); + background-size: 1rem; + background-position: right 0.5rem center; + background-repeat: no-repeat; + appearance: none; +} + +select:not([multiple="multiple"]):focus, +input:not(.cbi-button):focus, +.cbi-dropdown:focus { + border-color: var(--primary); + box-shadow: 0 3px 9px rgba(50, 50, 9, 0), 3px 4px 8px rgba(94, 114, 228, 0.1); + ; +} + +.cbi-dropdown, +select[multiple="multiple"] { + height: auto; +} + + +@import url("sysauth.less"); +@import url("layout.less"); + +#xhr_poll_status { + display: flex; + margin-left: 0.5rem; + + * { + color: #fff; + } +} + + +// alert + +.danger { + background-color: var(--danger) !important; +} + +.warning { + background-color: var(--warning) !important; +} + +.success { + background-color: var(--success) !important; +} + +.notice { + background-color: var(--info) !important; + color: #fff; +} + +.error { + color: var(--danger); +} + +.alert, +.alert-message { + position: fixed; + width: 20rem; + z-index: 9000; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + font-weight: bold; + padding: 1rem 1.25rem; + border: 0; + border-radius: 0.25rem !important; + background-color: #fff; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12); + text-shadow: none; + + + &.error { + background-color: var(--warning); + } + + h4 { + padding: 0.25rem 0rem; + border-radius: 0.25rem; + } + + .btn { + height: auto; + } +} + +.modal.alert-message { + position: static; + width: 90%; + min-width: 270px; + max-width: 600px; + left: auto; + top: auto; + transform: none; + margin: 5em auto; +} + +.alert-message>h4 { + font-size: 110%; + font-weight: bold; +} + +.alert-message>* { + margin: .5rem 0; +} + +.alert-message .btn { + padding: .3rem .6rem; +} + +.container .alert, +.container .alert-message { + margin-left: 0; + margin-right: 0; + margin-top: 0rem; + position: relative; + top: 0; + transform:translate(-50%, 0); + width: 100%; +} + +#mwan3-service-status > .alert-message { + left: 0.5rem; + transform: none; +} + +.lg { + margin: 0; + padding: 0 !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 { + font-family: inherit; + font-weight: normal; + font-style: normal; + line-height: normal; + min-width: inherit; + padding: 0; + border: 0; + + border-radius: 0.25rem; + background-color: #fff; + box-shadow: 0 0 1rem 0 rgba(136, 152, 170, .15); + + &:last-child { + margin: 0; + border: 0; + } + +} + +.cbi-modal .cbi-section, +.cbi-section .cbi-section { + padding: 0; + box-shadow: none; +} + +.cbi-modal .cbi-tabmenu { + margin-left: 0; +} + +.cbi-map { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.cbi-map>.cbi-tabmenu+div { + margin-top: -0.4375rem; +} + +.cbi-map-descr { + font-size: small; + line-height: 1.5; + padding: 0 1.25rem; +} + +.cbi-section { + + &>.cbi-section-descr { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + + &:empty { + display: none; + } + } + +} + +.cbi-section-descr:not(:empty) { + font-size: small; + line-height: 1.5; + padding: 0rem 1rem; +} + +.cbi-section-descr:empty { + display: none !important; +} + +.cbi-map-descr+fieldset { + margin-top: 1rem; +} + +.cbi-map-descr>abbr { + cursor: help; + text-decoration: underline; +} + +.cbi-section>legend { + display: none !important; +} + +fieldset>fieldset, +.cbi-section>.cbi-section { + margin: 0; + padding: 0; + border: 0; + box-shadow: none; +} + +.cbi-section>h3:first-child, +.panel-title { + font-size: 1.1rem; + line-height: 1; + display: block; + width: 100%; + margin: 0; + margin-bottom: 0; + padding: 0.8755rem 1.25rem; + color: #32325d; + color: var(--gray-dark); + +} + +.cbi-section>h3:first-child, +.cbi-section>h4:first-child, +.cbi-section>p:first-child, +[data-tab-title]>h3:first-child, +[data-tab-title]>h4:first-child, +[data-tab-title]>p:first-child { + padding: 1rem 1.25rem; +} + +.cbi-section p { + padding: 1rem; +} + +.cbi-tblsection { + overflow-x: auto; +} + +table { + border-spacing: 0; + border-collapse: collapse; +} + +table, +.table { + overflow-y: hidden; + width: 100%; + font-size: 0.75rem; +} + +.table .table-titles th { + background-color: var(--lighter); +} + +table>tbody>tr>td, +table>tbody>tr>th, +table>tfoot>tr>td, +table>tfoot>tr>th, +table>thead>tr>td, +table>thead>tr>th, +.table>.tbody>.tr>.td, +.table>.tbody>.tr>.th, +.table>.tfoot>.tr>.td, +.table>.tfoot>.tr>.th, +.table>.thead>.tr>.td, +.table>.thead>.tr>.th, +.table>.tr>.td.cbi-value-field, +.table>.tr>.th.cbi-section-table-cell { + padding: .5rem; +} + +.container>.cbi-section:first-of-type>.table[width="100%"]>.tr>.td { + padding: .6rem; +} + +.cbi-section-table-cell { + line-height: 1.1; + align-self: flex-end; + flex: 1 1 auto; +} + +tr>td, +tr>th, +.tr>.td, +.tr>.th, +.cbi-section-table-row::before, +#cbi-wireless>#wifi_assoclist_table>.tr:nth-child(2) { + border-top: thin solid #ddd; + padding: 1.1em 1.25rem; +} + +#cbi-wireless .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 { + border-top: 0 !important; + background-color: #f6f9fc; + padding: 1.1em 1.25rem; + line-height: 1.3rem; +} + + + + + +#cbi-network .tr:first-child>.td { + border-top: 0; +} + +.table[width="100%"]>.tr:first-child>.td { + margin: auto 0; +} + +.cbi-section-table-row { + margin-bottom: 1rem; + text-align: center !important; + background: #f4f4f4; +} + +.cbi-section-table-row:last-child { + margin-bottom: 0; +} + +.cbi-section-table-row>.cbi-value-field .cbi-dropdown, +.cbi-section-table-row>.cbi-value-field .cbi-input-select, +.cbi-section-table-row>.cbi-value-field .cbi-input-text, +.cbi-section-table-row>.cbi-value-field .cbi-input-password { + width: 100%; +} + +.cbi-section-table-row>.cbi-value-field .cbi-input-text, +.cbi-section-table-row>.cbi-value-field .cbi-input-password { + min-width: 80px; +} + +.cbi-section-table-row>.cbi-value-field [data-dynlist]>input, +.cbi-section-table-row>.cbi-value-field input.cbi-input-password { + width: calc(100% - 1.5rem); +} + +.cbi-section-table-row .td { + text-align: center !important; + + .cbi-checkbox { + input[type="checkbox"] { + margin: 0; + } + } +} + +.control-group { + display: inline-flex; + width: 100%; + flex-wrap: wrap; + gap: 1rem; + + input { + border-right-width: 0; + margin-right: 0; + } + + input+button { + border-bottom-left-radius: 0; + border-top-left-radius: 0; + margin-left: 0; + border-left-width: 0; + } +} + +.control-group:has(> input:first-child + .cbi-button) { + gap: 0 !important; + + input { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + width: 15.5rem; + min-width: 15.5rem; + } +} + + + +.control-group>* { + vertical-align: middle; +} + +div>table>tbody>tr:nth-of-type(2n), +div>.table>.tr:nth-of-type(2n) { + background-color: #f9f9f9; +} + +/* fix multiple table */ +table table, +.table .table, +.cbi-value-field table, +.cbi-value-field .table, +td>table>tbody>tr>td, +.td>.table>.tbody>.tr>.td, +.cbi-value-field>table>tbody>tr>td, +.cbi-value-field>.table>.tbody>.tr>.td { + border: 0; +} + +/* button style */ +.btn, +.cbi-button, +.item::after { + font-size: .875rem; + display: inline-block; + width: auto !important; + padding: 0.5rem .75rem; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + transition: all .2s ease-in-out; + text-align: center; + vertical-align: middle; + white-space: nowrap; + text-decoration: none; + border: 0; + border-radius: .25rem; + background-color: #f0f0f0; + background-image: none; + appearance: none; + -ms-touch-action: manipulation; + touch-action: manipulation; +} + + +.btn:not(button) ul:not(.dropdown) li { + padding: 0; +} + +.cbi-button-up, +.cbi-button-down { + display: inline-block; + min-width: 0; + padding: .2rem 1rem; + font-size: 0; + color: transparent !important; + background: url(../icon/arrow.svg) no-repeat center; + background-size: 12px 20px; +} + +.cbi-button-up { + transform: scaleY(-1); +} + +.cbi-button:not(select) { + appearance: none !important; +} + +.btn:hover, +.btn:focus, +.btn:active, +.cbi-button:hover, +.cbi-button:focus, +.cbi-button:active, +.item:hover::after, +.item:focus::after, +.item:active::after, +.cbi-page-actions .cbi-button-apply+.cbi-button-save:hover, +.cbi-page-actions .cbi-button-apply+.cbi-button-save:focus, +.cbi-page-actions .cbi-button-apply+.cbi-button-save:active { + text-decoration: none; + outline: 0; +} + +.btn:hover, +.btn:focus, +.cbi-button:hover, +.cbi-button:focus, +.item:hover::after, +.item:focus::after { + box-shadow: 0 3px 9px rgba(50, 50, 9, 0), 3px 4px 8px rgba(94, 114, 228, 0.1); +} + +.btn:active, +.cbi-button:active, +.item:active::after { + box-shadow: 0 3px 9px rgba(50, 50, 9, 0), 3px 4px 8px rgba(94, 114, 228, 0.1); +} + +.cbi-button-up:hover, +.cbi-button-up:focus { + box-shadow: 0 3px 9px rgba(50, 50, 9, 0), 3px 4px 8px rgba(94, 114, 228, 0.1); +} + +.cbi-button-up:active { + box-shadow: 0 3px 9px rgba(50, 50, 9, 0), 3px 4px 8px rgba(94, 114, 228, 0.1); +} + +.btn:disabled, +.cbi-button:disabled { + cursor: not-allowed; + pointer-events: none; + opacity: .5; + box-shadow: none; +} + +/* gray */ +.alert-message [class="btn"], +.modal div[class="btn"], +.cbi-button-find, +.cbi-button-link, +.cbi-button-up, +.cbi-button-down, +.cbi-button-neutral, +.cbi-button[name="zero"], +.cbi-button[name="restart"], +.cbi-button[onclick="hide_empty(this)"] { + color: #fff; + border: thin solid #8898aa; + background-color: #8898aa; +} + +/* dark blue */ +.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)"] { + font-weight: normal; + color: #fff !important; + border: thin solid #5e72e4; + border: thin solid var(--primary); + background-color: #5e72e4; + background-color: var(--primary); + ; +} + +/* light blue */ +.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)"] { + font-weight: normal; + color: #fff !important; + border: thin solid #5e72e4; + border: thin solid var(--primary); + + background-color: #5e72e4; + background-color: var(--primary); +} + +/* red */ +.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"] { + font-weight: normal; + color: #fff; + border: thin solid #f5365c; + border: thin solid var(--red); + background-color: #f5365c; + background-color: var(--red); +} + +/* yellow */ +.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"] { + font-weight: normal; + color: var(--white); + border: thin solid #eea236; + background-color: #f0ad4e; +} + +/* green */ +.cbi-button-success, +.cbi-button-download { + font-weight: normal; + color: var(--white); + border: thin solid #4cae4c; + background-color: #5cb85c; +} + +.cbi-page-actions { + .cbi-button-link:first-child { + float: left; + } + + .cbi-dropdown { + .open { + color: var(--white); + } + + .more { + display: block; + width: 1px; + height: 100%; + overflow: hidden; + text-indent: 5000px; + background-color: var(--white) + } + } +} + + +.a-to-btn { + text-decoration: none; +} + +.cbi-value-field .cbi-button-add { + font-weight: bold; + padding: 1px 6px; + display: inline-block; + align-items: center; +} + +.tabs { + padding: 0 1rem; + background-color: #FFFFFF; + border-radius: 0.25rem; + box-shadow: 0 4px 8px rgba(0, 0, 0, .03); + white-space: nowrap; + overflow-x: auto; + + &::-webkit-scrollbar { + width: 1px; + height: 5px; + } + + &::-webkit-scrollbar-thumb { + background-color: #f6f9fc + } + + &::-webkit-scrollbar-track { + background-color: #fff; + } + + li[class~="active"], + li:hover { + cursor: pointer; + border-bottom: 0.18751rem solid #5e72e4; + border-bottom: 0.18751rem solid var(--primary); + color: #5e72e4; + color: var(--primary); + background-color: #e4e9ee; + margin-bottom: 0; + border-radius: 0; + + a { + color: #5e72e4; + color: var(--primary); + } + } + + li { + font-size: 0.875rem; + display: inline-block; + padding: 0.875rem 0rem; + border-bottom: 0.18751rem solid rgba(0, 0, 0, 0); + margin: 0; + transition: all 0.2s; + + a { + text-decoration: none; + color: #404040; + padding: 0.5rem 0.8rem; + } + + &:hover { + border-bottom: 0.18751rem solid #5e72e4; + border-bottom: 0.18751rem solid var(--primary); + } + } +} + + +.cbi-tabmenu { + color: white; + padding: 0.5rem 1rem 0 1rem; + white-space: nowrap; + overflow-x: auto; + + &::-webkit-scrollbar { + width: 1px; + height: 5px; + } + + &::-webkit-scrollbar-thumb { + background-color: #f6f9fc + } + + &::-webkit-scrollbar-track { + background-color: #fff; + } + + li { + background: #dce3e9; + display: inline-block; + font-size: 0.875rem; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; + padding: 0.5rem 0rem; + border-bottom: 0.18751rem solid rgba(0, 0, 0, 0); + margin: 0 0.2rem; + position: relative; + + a { + text-decoration: none; + color: #404040; + padding: 0.5rem 0.8rem; + } + + &:hover { + cursor: pointer; + border-bottom: 0.18751rem solid #5e72e4; + border-bottom: 0.18751rem solid var(--primary); + color: #5e72e4; + color: var(--primary); + background-color: #e4e9ee; + margin-bottom: 0; + + a { + color: #525f7f; + } + } + } + + li[class~="cbi-tab"] { + border-bottom: 0.18751rem solid #5e72e4; + border-bottom: 0.18751rem solid var(--primary); + color: #5e72e4; + color: var(--primary); + background-color: #e4e9ee; + margin-bottom: 0; + + a { + color: #5e72e4; + color: var(--primary); + } + } +} + +.cbi-tab-descr { + padding: 0 1.25rem; +} + +.cbi-section-node { + display: flex; + flex-direction: column; + gap: 0.875rem; + + >[id^="cbi-config-"] { + display: flex; + flex-direction: column; + gap: 0.875rem; + + &:first-child { + padding-top: 1rem; + } + + &:last-child { + padding-bottom: 1rem; + } + } +} + +.cbi-section .cbi-section-remove:nth-of-type(2n), +.container>.cbi-section .cbi-section-node:nth-of-type(2n) { + background-color: #f9f9f9; +} + +[data-tab-title] { + overflow: hidden; + height: 0; + opacity: 0; + margin: 0; + padding: 1rem 0; + display: none !important; + + p { + margin-left: 1rem; + margin-bottom: 1rem; + } +} + +[data-tab-active="true"] { + overflow: visible; + height: auto; + opacity: 1; + display: inherit !important; + transition: opacity .25s ease-in; + margin: inherit !important; +} + + +.cbi-section[id] .cbi-section-remove:nth-of-type(4n+3), +.cbi-section[id] .cbi-section-node:nth-of-type(4n+4) { + background-color: #f9f9f9; +} + +.cbi-section-node-tabbed { + margin-top: 0; + border: 0 solid #d4d4d4; + border-radius: 0.25rem; + + &>div { + display: flex; + + flex-direction: column; + gap: 0.875rem; + } +} + +.cbi-tabcontainer>.cbi-value:nth-of-type(2n) { + background-color: #f9f9f9; +} + +.cbi-value-field { + display: table-cell; + + & div+br { + display: none; + } +} + +.cbi-value-description { + line-height: 1.25; + display: table-cell; + padding: .5rem 0; + opacity: .5; + font-size: 0.75rem; + + abbr { + color: #32325d; + color: var(--gray-dark); + } + + &:empty { + display: none; + } +} + +.cbi-value-title { + display: table-cell; + float: left; + width: 23rem; + + padding-right: 2rem; + text-align: right; + word-wrap: break-word; +} + +.cbi-value { + display: inline-block; + width: 100%; + padding: 0 1rem; + line-height: 2.4rem; + + ul { + line-height: 1.25; + } +} + +.cbi-value-field.cbi-dropdown-open { + .cbi-dropdown { + border-color: var(--primary); + box-shadow: 0 3px 9px rgba(50, 50, 9, 0), 3px 4px 8px rgba(94, 114, 228, .1); + } +} + +.cbi-value-field .cbi-dropdown, +.cbi-value-field .cbi-input-select, +.cbi-value input[type="text"], +.cbi-value input[type="password"], +.cbi-value textarea { + min-width: 18rem; +} + + + + +#cbi-firewall-zone .cbi-input-select, +#cbi-network-switch_vlan .cbi-input-select { + min-width: 11rem; +} + +#cbi-network-switch_vlan .cbi-input-text { + max-width: 3rem; +} + +.cbi-input-file { + appearance: auto !important; + + &::-webkit-file-upload-button { + display: inline-block !important; + } +} + +.cbi-input-invalid { + color: #f5365c !important; + border-color: #f5365c !important; +} + +.cbi-section-error { + font-weight: bold; + line-height: 1.42857143; + margin: 18px; + padding: 6px; + border: thin solid #f5365c; + border-radius: 3px; + background-color: #fce6e6; +} + +.cbi-section-error ul { + margin: 0 0 0 20px; +} + +.cbi-section-error ul li { + font-weight: bold; + color: #f5365c; +} + +.td[data-title]::before { + font-weight: bold; + display: none; + padding: .25rem 0; + content: attr(data-title) ":\20"; + text-align: left; + white-space: nowrap; +} + +.tr.placeholder .td[data-title]::before { + display: none; +} + +.tr[data-title]::before, +.tr.cbi-section-table-titles.named::before { + font-weight: bold; + display: table-cell; + align-self: center; + flex: 1 1 5%; + padding: .25rem; + content: attr(data-title) "\20"; + text-align: center; + vertical-align: middle; + white-space: normal; + word-wrap: break-word; + background-color: #f6f9fc; +} + +.cbi-rowstyle-1 { + background-color: #f9f9f9; +} + +.cbi-rowstyle-2 { + background-color: #eee; +} + +.cbi-rowstyle-2 .cbi-button-up, +.cbi-rowstyle-2 .cbi-button-down, +body:not(.Interfaces) .cbi-rowstyle-2:first-child { + background-color: #fff !important; +} + +.cbi-section-table .cbi-section-table-titles .cbi-section-table-cell { + width: auto !important; +} + +.td.cbi-section-actions { + text-align: right !important; + vertical-align: middle; +} + +.td.cbi-section-actions>* { + display: inline-flex; + gap: 1rem; +} + +.td.cbi-section-actions>*>*, +.td.cbi-section-actions>*>form>* { + display: flex; + align-items: center; +} + +.td.cbi-section-actions>*>form { + display: inline-flex; + margin: 0; +} + +.td .cbi-checkbox { + justify-content: center; +} + +.cbi-checkbox { + display: flex; + align-items: center; + height: 2.5rem; +} + +/* lists */ +.cbi-dynlist { + + line-height: 1.3; + flex-direction: column; + min-height: 30px; + cursor: text; + gap: 0.875rem; + + &>.item { + display: inline-flex; + flex-wrap: nowrap; + position: relative; + max-width: 25rem; + pointer-events: none; + color: #8898aa; + outline: 0; + + &::after { + content: "\00D7"; + pointer-events: auto; + display: flex; + align-items: center; + justify-content: center; + width: 2.5rem !important; + height: 2.5rem; + margin: 0; + font-weight: normal; + font-size: 1rem; + line-height: 1.5rem; + + color: #fff; + border: 1px solid #f5365c; + border-radius: 0 0.25rem 0.25rem 0; + outline: 0; + + background-color: var(--red); + background-image: none; + box-shadow: none; + box-sizing: border-box; + } + + &>span { + display: block; + padding: 0.5rem 0.75rem; + box-sizing: border-box; + min-width: 15.5rem; + width: 15.5rem; + height: 2.5rem; + transition: box-shadow 0.15s ease; + overflow: hidden; + text-overflow: ellipsis; + user-select: text; + + white-space: nowrap; + word-break: break-word; + line-height: 1.5em; + + color: #8898aa; + border: 1px solid #dee2e6; + border-radius: .25rem 0 0 .25rem; + outline: 0; + background-image: none; + box-shadow: none; + box-sizing: border-box; + transition: box-shadow .15s ease; + + } + } + + &>.add-item { + display: inline-flex; + align-items: center; + width: 100%; + min-width: 15.5rem; + flex-wrap: nowrap; + + input { + display: block; + padding: 0.5rem 0.75rem; + box-sizing: border-box; + min-width: 15.5rem; + width: 15.5rem; + transition: box-shadow 0.15s ease; + + white-space: nowrap; + word-break: break-word; + font-size: .875rem; + line-height: 1.5rem; + + color: #8898aa; + border: 1px solid #dee2e6; + border-radius: .25rem 0 0 .25rem; + border-right-width: 0; + outline: 0; + background-image: none; + box-shadow: none; + } + + .cbi-button { + display: flex; + width: auto !important; + padding-left: 0.8rem; + padding-right: 0.8rem; + margin-left: 0; + align-items: center; + justify-content: center; + + font-size: 0.875rem; + line-height: 1.5rem; + + outline: 0; + background-image: none; + background-color: var(--gray); + box-shadow: none; + color: var(--white); + border-color: var(--gray); + border-radius: 0.25rem; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + + .cbi-button-add { + width: 2.5rem !important; + padding: 0.5rem 0 !important; + + font-weight: normal; + font-size: 1.2rem; + + color: #fff; + background-color: var(--primary); + border: 1px solid var(--primary); + } + + + &:not([ondrop]) { + &>input { + overflow: hidden; + min-width: 15.5rem; + width: 15.5rem; + white-space: nowrap; + text-overflow: ellipsis; + } + } + } +} + +.cbi-dynlist>.item.drag-over, +.cbi-dynlist>.add-item:has(.drag-over) { + border-top: 1px solid var(--red); + margin-top: -1px; +} + +.cbi-dynlist[name="sshkeys"]>.item { + max-width: none; +} + + +.cbi-dynlist>.cbi-dynlist>.add-item[ondrop]>input { + min-width: 13rem; +} + +.cbi-dynlist, +.cbi-dropdown { + position: relative; + display: inline-flex; + padding-right: 0.25rem; + min-height: 2.1875rem; +} + +.cbi-dropdown { + align-items: center; +} + +.cbi-dropdown.btn>ul:not(.dropdown), +.cbi-dropdown.cbi-button>ul:not(.dropdown) { + margin: 0 0.75rem; +} + +.cbi-dropdown[placeholder*="select"] { + max-width: 25rem; + height: auto; + margin-top: -3px; +} + +.cbi-dropdown>ul { + display: flex; + overflow-x: hidden; + overflow-y: auto; + width: 100%; + padding: 0; + list-style: none; + outline: 0; +} + + +.cbi-dropdown>ul.preview { + display: none; + +} + +.cbi-dropdown.cbi-button-apply, +.cbi-dropdown.cbi-button-action { + padding: 0; +} + +.cbi-button-apply>ul.preview { + display: none; + + li { + color: #fff; + } + +} + +.cbi-button-apply>ul:first-child { + li { + color: #fff; + } + +} + +.cbi-dropdown>.open { + display: flex; + align-items: center; + width: 1rem; + height: 100%; + padding: 0 0.75rem; + cursor: pointer; + user-select: none; + font-size: 0; + color: #8898aa; + background-color: currentColor; + mask-image: var(--dropdown-arrow-icon); + mask-repeat: no-repeat; + mask-size: 100% 1rem; + mask-position: center; + mask-mode: match-source; +} + + +.cbi-dropdown>.more, +.cbi-dropdown>ul>li[placeholder] { + display: none; +} + +.cbi-dropdown>ul>li { + display: none; + overflow: hidden; + align-items: center; + align-self: center; + flex-grow: 1; + flex-shrink: 1; + min-height: 20px; + padding: 0.125rem .25em; + white-space: nowrap; + text-overflow: ellipsis; + +} + +.cbi-dropdown>ul>li .hide-open { + display: initial; +} + +.cbi-dropdown>ul>li .hide-close { + display: none; +} + +.cbi-dropdown>ul>li[display]:not([display="0"]) { + border-left: thin solid #ccc; +} + +.cbi-dropdown[empty]>ul { + max-width: 1px; +} + +.cbi-dropdown>ul>li>form { + display: none; + margin: 0; + padding: 0; + pointer-events: none; +} + +.cbi-dropdown>ul>li img { + margin-right: .25em; + vertical-align: middle; +} + +.cbi-dropdown>ul>li>form>input[type="checkbox"] { + height: auto; + margin: 0; +} + +.cbi-dropdown>ul>li input[type="text"] { + height: 2rem; + min-width: 16rem; + padding: 0 .5rem; +} + +.cbi-dropdown[open]>ul.dropdown { + position: absolute; + z-index: 1100; + display: block; + width: auto; + min-width: 100%; + max-width: none; + max-height: 200px !important; + border: 0 solid #918e8c; + background: #ffffff; + box-shadow: 0 0 4px #918e8c; + border-radius: 0.25rem; + color: var(--main-menu-color); + margin-left: -0 !important; + margin-top: 0.25rem; + left: 0; + + li { + color: #000; + } +} + + +.cbi-dropdown>ul>li[display], +.cbi-dropdown[open]>ul.preview, +.cbi-dropdown[open]>ul.dropdown>li, +.cbi-dropdown[multiple]>ul>li>label, +.cbi-dropdown[multiple][open]>ul.dropdown>li, +.cbi-dropdown[multiple][more]>.more, +.cbi-dropdown[multiple][empty]>.more { + display: flex; + align-items: center; + flex-grow: 1; + +} + +.cbi-dropdown[empty]>ul>li, +.cbi-dropdown[optional][open]>ul.dropdown>li[placeholder], +.cbi-dropdown[multiple][open]>ul.dropdown>li>form { + display: block; +} + +.cbi-dropdown[open]>ul.dropdown>li .hide-open { + display: none; +} + +.cbi-dropdown[open]>ul.dropdown>li .hide-close { + display: initial; +} + +.cbi-dropdown[open]>ul.dropdown>li { + border-bottom: thin solid #ccc; + padding: 0.5rem 0.75rem; + cursor: pointer; +} + +.cbi-dropdown[open]>ul.dropdown>li label { + margin-left: 0.5rem; +} + +.cbi-dropdown[open]>ul.dropdown>li[selected] { + background: #e4e9ee; +} + +.cbi-dropdown[open]>ul.dropdown>li.focus { + background: #e4e9ee; + outline: none; +} + +.cbi-dropdown[open]>ul.dropdown>li:last-child { + margin-bottom: 0; + border-bottom: 0; +} + +.cbi-dropdown[open]>ul.dropdown>li[unselectable] { + opacity: .7; +} + +.cbi-dropdown[open]>ul.dropdown>li>input.create-item-input:first-child:last-child { + width: 100%; +} + +.cbi-dropdown[disabled] { + pointer-events: none; + opacity: .6; +} + +.cbi-dropdown .zonebadge { + width: 100%; +} + +.cbi-dropdown[open] .zonebadge { + width: auto; +} + +/* progressbar */ +.cbi-progressbar { + position: relative; + display: flex; + width: 100%; + font-size: 0.75rem; + background-color: #e9ecef; + border-radius: 0.5rem; + height: 1rem; + overflow: hidden; + + &>div { + display: block; + position: absolute; + height: 100%; + background-color: var(--primary); + border-radius: 0.5rem; + transition: width 0.3s; + } + + &::after { + content: attr(title); + position: absolute; + font-size: 0.75rem; + color: var(--bs-heading-color); + width: 100%; + height: 100%; + text-align: center; + line-height: 1rem; + z-index: 2; + } +} + +#modal_overlay { + position: fixed; + z-index: 900; + top: 0; + right: 10000px; + bottom: 0; + left: -10000px; + overflow-y: scroll; + transition: opacity .125s ease-in; + opacity: 0; + background: rgba(0, 0, 0, .7); + -webkit-overflow-scrolling: touch; +} + +.modal { + display: flex; + align-items: center; + flex-wrap: wrap; + width: 90%; + min-width: 270px; + max-width: 600px; + min-height: 32px; + margin: 5em auto; + padding: 1rem; + border-radius: 0.25rem !important; + background: #fff; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12); + + &>* { + line-height: normal; + flex-basis: 100%; + margin-bottom: .5em; + max-width: 100%; + } + + &>pre, + &>textarea { + font-size: 1rem; + font-size-adjust: .35; + overflow: auto; + ; + padding: 0.5rem; + cursor: auto; + white-space: pre-wrap; + color: var(--dark-primary); + outline: 0; + border-radius: 0.25rem; + border: 1px solid var(--lighter); + transition: all 0.2s ease; + + &:focus { + border: 1px solid var(--primary); + box-shadow: 0 3px 9px rgba(50, 50, 9, 0), 3px 4px 8px rgba(94, 114, 228, 0.1); + } + } + + &>h4 { + display: block; + flex-grow: 1; + max-width: none; + padding: 1rem; + margin: -1rem -1rem 0 -1rem; + font-size: 1rem; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.03); + border-radius: 0.25rem 0 0 0.25rem; + } + + h5 { + margin-top: 1rem; + font-weight: 600; + } + + label>input[type="checkbox"] { + top: 0; + } + + ul { + li { + list-style-type: square; + color: #808080; + } + } + + p { + word-break: break-word; + margin-top: 1rem; + } + + .label { + font-size: .6rem; + font-weight: normal; + padding: .1rem .3rem; + padding-bottom: 0; + cursor: default; + border-radius: 0; + } + + .label.warning { + background-color: #f0ad4e !important; + } + + .btn { + padding: 0.45rem 0.8rem; + } + + &.cbi-modal { + max-width: 90%; + max-height: none; + } + + .cbi-map { + margin-bottom: 1rem; + } +} + + +body.modal-overlay-active { + overflow: hidden; + height: 100vh; +} + +body.modal-overlay-active #modal_overlay { + right: 0; + left: 0; + opacity: 1; +} + + +.spinning { + position: relative; + padding-left: 32px !important; +} + +.spinning::before { + position: absolute; + top: 0; + bottom: 0; + + left: .2em; + width: 32px; + content: ""; + background: url(/luci-static/resources/icons/loading.svg) no-repeat center; + background-size: 16px; +} + + + +/* luci */ +.hidden { + display: none; +} + +.left, +.left::before { + text-align: left !important; +} + +.right, +.right::before { + text-align: right !important; +} + +.button-row { + display: flex; + flex-direction: row; + gap: 1rem; + align-items: center; + justify-content: flex-end; + margin-bottom: 0 !important; +} + +.center, +.center::before { + text-align: center !important; +} + +.top { + align-self: flex-start !important; + vertical-align: top !important; +} + +.bottom { + align-self: flex-end !important; + vertical-align: bottom !important; +} + +.inline { + display: inline; +} + +.cbi-page-actions { + padding: 1rem; + justify-content: flex-end; + display: flex; + gap: 1rem; +} + +.cbi-page-actions>form[method="post"] { + display: inline-block; +} + +.th[data-type="button"], +.td[data-type="button"], +.th[data-type="fvalue"], +.td[data-type="fvalue"] { + flex: 1 1 2em; + text-align: center; +} + +.ifacebadge { + display: inline-flex; + align-items: center; + gap: .2rem; + padding: .25rem .8rem; + + background: #eee; + border-radius: 4px; +} + +td>.ifacebadge, +.td>.ifacebadge { + font-size: .875rem; + background-color: #f0f0f0; +} + +.ifacebadge>em, +.ifacebadge>img { + display: inline-block; + margin: 0 0.75rem; +} + +.ifacebadge>img+img { + margin: 0 .2rem 0 0; +} + +.network-status-table { + display: flex; + flex-wrap: wrap; + + .ifacebox { + flex-grow: 1; + border-radius: .25rem; + overflow: hidden; + margin: 1rem; + } + + .ifacebox-body { + display: flex; + flex-direction: column; + height: 100%; + gap: 0.5em; + + >span { + flex: 10 10 auto; + } + + >div { + display: flex; + flex-wrap: wrap; + gap: .5rem; + height: 100%; + } + + .ifacebadge { + align-items: center; + flex: 1 1 auto; + min-width: 220px; + padding: .5em; + background-color: #fff; + + >span { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + } + } +} + +/* textarea */ +.cbi-input-textarea { + font-family: inherit; + width: 100%; + font-size: 0.875rem; + min-height: 14rem; + padding: .8rem; + color: #8898aa; + border-radius: 0.25rem; + border: 1px solid #dee2e6; + min-width: 16rem; +} + +#content_syslog { + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.03); +} + +#syslog { + font-size: small; + font-family: 'Google Sans'; + line-height: 1.25; + width: 100%; + min-height: 15rem; + padding: 1rem; + resize: none; + color: #242424; + border: 0; + border-radius: 0.25rem; + background-color: #ffffff; + +} + +#syslog:focus { + outline: 0; +} + +#cbi-ddns #syslog { + overflow: auto; +} + +/* config changes */ +.uci-change-list { + font-family: inherit; + overflow: scroll; + width: 100%; + display: flex; + flex-direction: column; + flex-wrap: wrap; +} + +.uci-change-list ins, +.uci-change-legend-label ins { + display: block; + padding: 2px; + text-decoration: none; + border: thin solid #0f0; + background-color: #cfc; +} + +.uci-change-list del, +.uci-change-legend-label del { + font-style: normal; + display: block; + padding: 2px; + text-decoration: none; + border: thin solid #f00; + background-color: #fcc; +} + +.uci-change-list var, +.uci-change-legend-label var { + font-style: normal; + display: block; + padding: 2px; + text-decoration: none; + border: thin solid #ccc; + background-color: #eee; +} + +.uci-change-list var ins, +.uci-change-list var del { + font-style: normal; + padding: 0; + white-space: pre; + border: 0; +} + +.uci-change-legend { + padding: 5px; +} + +.uci-change-legend-label { + float: left; + width: 150px; +} + +.uci-change-legend-label>ins, +.uci-change-legend-label>del, +.uci-change-legend-label>var { + display: block; + float: left; + width: 10px; + height: 10px; + margin-right: 4px; +} + +.uci-change-legend-label var ins, +.uci-change-legend-label var del { + line-height: .4; + border: 0; +} + +.uci-change-list var, +.uci-change-list del, +.uci-change-list ins { + padding: .5rem; +} + +.uci-dialog { + .cbi-section { + padding: 0.5rem; + + .uci-change-legend { + line-height: 15px; + padding: 10px 20px 0 20px; + + .uci-change-legend-label { + padding: 0; + margin: 0; + position: relative; + float: none; + display: inline-block; + width: 25%; + + >ins, + >del { + width: 14px; + height: 14px; + } + + >var { + position: relative; + width: 14px; + height: 14px; + + ins, + del { + position: absolute; + left: 2px; + top: 2px; + right: 2px; + bottom: 2px; + } + } + } + } + + .uci-change-list { + overflow: auto; + } + + .uci-change-list+.right { + .btn { + color: #333; + } + + .cbi-dropdown ul:not(.dropdown) { + li { + color: #fff; + } + } + + .cbi-button { + padding: .45rem .8rem; + } + } + } +} + +/* other fix */ +#iwsvg, +#iwsvg2, +#bwsvg { + border: thin solid #d4d4d4 !important; +} + +#iwsvg { + border-top: 0 !important; +} + +.ifacebox { + line-height: 1.25; + display: inline-flex; + overflow: hidden; + flex-direction: column; + border-radius: 4px; + min-width: 100px; + background-color: #f9f9f9; + // border-bottom: thin solid #ccc; + // box-shadow: inset 0 1px 0 rgba(255, 255, 255, .4), 0 1px 2px rgba(0, 0, 0, .2); +} + +.ifacebox-head { + padding: .25em; + background: #eee; +} + +.ifacebox-head.active { + background: #5e72e4; + background: var(--primary); + + * { + color: #fff; + color: var(--white); + } + +} + +.ifacebox-body { + padding: 0.875rem 1rem; + line-height: 1.6em; +} + +.cbi-image-button { + margin-left: .5rem; +} + +.zonebadge { + display: inline-block; + padding: .2rem .5rem; + border-radius: 4px; +} + +.zonebadge .ifacebadge { + margin: .1rem .2rem; + padding: .2rem .3rem; + border: thin solid #6c6c6c; +} + +.zonebadge>input[type="text"] { + min-width: 10rem; + margin-top: .3rem; + padding: .16rem 1rem; +} + +.zonebadge>em, +.zonebadge>strong { + display: inline-block; + margin: 0 .2rem; +} + +.cbi-value-field .cbi-input-checkbox, +.cbi-value-field .cbi-input-radio { + margin-top: .1rem; +} + +.cbi-value-field>ul>li { + display: flex; +} + +.cbi-value-field>ul>li>label { + margin-top: .5rem; +} + +.cbi-value-field>ul>li .ifacebadge { + margin-top: -.5rem; + margin-left: .4rem; + background-color: #eee; +} + +.cbi-section-table-row>.cbi-value-field .cbi-dropdown { + min-width: 3rem; +} + +.cbi-section-create { + display: inline-flex; + align-items: center; + padding: .875rem 1rem; + + + &>div:first-child { + &>input { + width: 100%; + border-right: none; + border-bottom-right-radius: 0; + border-top-right-radius: 0; + } + } + + &>div:first-child+button { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } +} + + +.cbi-section-remove { + padding: .5rem 1rem; +} + +div.cbi-value var, +td.cbi-value-field var, +.td.cbi-value-field var { + font-style: italic; + color: #0069d6; +} + +.cbi-optionals { + padding: 1rem 1rem 0 1rem; + border-top: thin solid #ccc; +} + +.cbi-dropdown-container { + position: relative; +} + +.cbi-tooltip-container, +span[data-tooltip], +span[data-tooltip] .label { + cursor: help !important; +} + +.cbi-tooltip { + position: absolute; + z-index: 1000; + left: -10000px; + box-shadow: 0 3px 9px rgba(50, 50, 9, 0), 3px 4px 8px rgba(94, 114, 228, 0.1); + border-radius: 0.25rem; + background: #fff; + white-space: pre; + padding: 0.5rem; + opacity: 0; + transition: opacity .25s ease-in; + transform: translate(-50%, 10%); +} + +.cbi-tooltip-container:hover .cbi-tooltip:not(:empty) { + left: auto; + transition: opacity .25s ease-in; + opacity: 1; +} + +.zonebadge .cbi-tooltip { + margin: -1.5rem 0 0 -.5rem; + padding: .25rem; + background: inherit; +} + +.zonebadge-empty { + color: #404040; + background: repeating-linear-gradient(45deg, rgba(204, 204, 204, .5), rgba(204, 204, 204, .5) 5px, rgba(255, 255, 255, .5) 5px, rgba(255, 255, 255, .5) 10px); +} + +.zone-forwards { + display: flex; + min-width: 10rem; +} + +.zone-forwards>* { + flex: 1 1 45%; +} + +.zone-forwards>span { + flex-basis: 10%; + padding: 0 .25rem; + text-align: center; +} + +.zone-forwards .zone-src, +.zone-forwards .zone-dest { + display: flex; + flex-direction: column; +} + +.label { + font-size: .875rem; + font-weight: bold; + padding: .3rem .8rem; + white-space: nowrap; + text-decoration: none; + text-transform: uppercase; + color: #fff !important; + border-radius: 3px; + background-color: #bfbfbf; + text-shadow: none; +} + +label>input[type="checkbox"], +label>input[type="radio"] { + position: relative; + top: .4rem; + right: .2rem; + margin: 0; + vertical-align: bottom; +} + +label[data-index][data-depends] { + padding-right: 2em; +} + +.showSide { + display: none; +} + +.darkMask { + position: fixed; + z-index: 99; + display: none; + width: 100%; + height: 100%; + content: ""; + top: 0; + background-color: rgba(0, 0, 0, .56); + transition: all 0.2s; + + &.active { + display: block; + } +} + +/* diagnostics */ +#diag-rc-output>pre, +#command-rc-output>pre, +[data-page="admin-services-wol"] .notice code { + font-size: 1.2rem; + font-size-adjust: .35; + line-height: normal; + display: block; + overflow-y: hidden; + width: 100%; + padding: 8.5px; + white-space: pre; + color: #eee; + background-color: #101010; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12); +} + + + +input[name="ping"], +input[name="traceroute"], +input[name="nslookup"] { + width: 80%; +} + +.controls { + gap: 0.5rem; + margin: 0 1.25rem !important; +} + +.controls>div { + gap: 0.5rem; +} + +.controls>*>.btn:not([aria-label$="page"]) { + flex-grow: initial !important; + margin-top: .25rem; +} + +.controls>#pager>.btn[aria-label$="page"] { + font-size: 1.4rem; + font-weight: bold; +} + +.controls>*>label { + margin-bottom: .2rem; +} + +.td.version, +.td.size { + white-space: normal !important; + word-break: break-word; +} + +.cbi-tabmenu+.cbi-section { + margin-top: 0; +} + + +.cbi-tab-disabled[data-errors]::after { + position: absolute; + top: -0.25rem; + right: -0.25rem; + content: attr(data-errors); + background-color: var(--red); + color: #fff; + width: 0.875rem; + height: 0.875rem; + border-radius: 0.875rem; + text-align: center; + display: inline-flex; + flex-direction: column; + justify-content: center; + font-size: .75em; +} + + + + +/* custom commands */ +.commands { + display: grid !important; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 0.75rem; +} + +.commandbox { + padding: .5rem 1rem; + gap: 0.5rem; + border-bottom: thin solid #ccc; + border-radius: .25rem; + background: #eee; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .2), 0 1px 2px rgba(0, 0, 0, .05); + + h3 { + line-height: normal !important; + overflow: hidden; + margin: 6px 0 !important; + white-space: nowrap; + text-overflow: ellipsis; + } + + div { + left: auto !important; + } + + code { + overflow: hidden; + max-width: fit-content; + padding: 2px 3px; + white-space: nowrap; + text-overflow: ellipsis; + + &:hover { + overflow-y: auto; + max-height: 50px; + white-space: normal; + } + } + + p:first-of-type { + margin-top: -6px; + } + + p:nth-of-type(2) { + margin-top: 2px; + } +} + + + +#command-rc-output .alert-message { + line-height: 1.42857143; + position: absolute; + top: 40px; + right: 32px; + max-width: 40%; + margin: 0; + animation: anim-fade-in 1.5s forwards; + word-break: break-word; + opacity: 0; +} + +@keyframes anim-fade-in { + 100% { + opacity: 1; + } +} + +/* other fix */ + + +.fb-container .cbi-button { + height: auto !important; +} + +#cbi-usb_printer-printer em { + display: block; + padding: 1rem; + text-align: center; +} + +pre.command-output { + padding: 1.5rem; +} + + +/* page fix */ +@import url("page-fix.less"); + +/* responsive */ +@import url("responsive.less"); diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/dark.less b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/dark.less new file mode 100644 index 0000000..8e8970d --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/dark.less @@ -0,0 +1,1222 @@ +// out: ../htdocs/luci-static/argon/css/dark.css, compress: true , sourceMap: false +/** + * Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material and Argon Template + * + * luci-theme-argon + * Copyright 2025 Jerryk + * + * Have a bug? Please create an issue here on GitHub! + * https://github.com/jerrykuku/luci-theme-argon/issues + * + * luci-theme-bootstrap: + * Copyright 2008 Steven Barth + * Copyright 2008 Jo-Philipp Wich + * Copyright 2012 David Menting + * + * MUI: + * https://github.com/muicss/mui + * + * luci-theme-material: + * https://github.com/LuttyYang/luci-theme-material/ + * + * Agron Theme + * https://demos.creative-tim.com/argon-dashboard/index.html + * + * Login background + * https://unsplash.com/ + * + * Licensed to the public under the Apache License 2.0 + */ + + +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)); + + .brand { + color: #adb5bd; + } + + .form-login { + .input-group { + &::before { + color: #adb5bd; + } + + 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; + } + + } + + .cbi-button-apply { + background-color: #483d8b !important; + background-color: var(--dark-primary) !important; + + &:hover, + &:focus { + opacity: 0.9; + } + } + } + } + +} + +header::after { + background-color: #1e1e1e !important; +} + + +.main { + .main-left { + + background-color: #333333 !important; + box-shadow: 0 0 0.5rem 0 rgba(0, 0, 0, .15); + + .sidenav-header .brand { + color: #cccccc; + } + + .nav { + .slide { + .slide-menu { + .active { + a { + color: #cccccc; + + &::after { + background-color: #cccccc !important; + } + } + + &::after { + background-color: var(--dark-primary) !important; + } + } + + li { + a { + color: #cccccc; + } + + a:hover { + background: none !important; + } + + &::after { + background-color: var(--dark-primary) !important; + } + } + } + + .menu.active { + background-color: #483d8b !important; + background-color: var(--dark-primary) !important; + color: #ffffff !important; + + a::after { + background-color: #ffffff !important; + } + } + } + + li { + a { + color: #cccccc !important; + } + + a:hover { + background-color: #483d8b !important; + background-color: var(--dark-primary) !important; + color: #ffffff !important; + } + + } + } + + + &::-webkit-scrollbar-thumb { + background-color: #252526 !important; + } + + &::-webkit-scrollbar-track { + background-color: #333; + } + } + + .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 0.5rem 0 rgba(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; + + 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; + + 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: rgb(102, 102, 102) !important; +} + +.cbi-section > h3:first-child, +.panel-title, +h3 { + color: #ccc; +} + +h4 { + background-color: #1e1e1f; +} + +.cbi-progressbar { + background: #282a2c; + + 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 0.5rem 0 rgba(0, 0, 0, .35) +} + +#syslog { + color: #ccc; + background-color: #1e1e1e; +} + +#iwsvg, +#iwsvg2, +#bwsvg { + overflow: hidden; + box-shadow: 0 0 0.5rem 0 rgba(0, 0, 0, .35); + background-color: #1e1e1e !important; +} + +.tabs { + background-color: #252526; + + li[class~="active"], + li:hover { + cursor: pointer; + color: #ccc !important; + + a { + color: #ccc !important; + } + } +} + +.tabs > li[class~="active"] > a { + color: #ccc; +} + +.tabs > li[class~="active"], +.tabs > li:hover { + border-bottom: 0.18751rem solid #483d8b; + border-bottom: 0.18751rem solid var(--dark-primary); + color: var(--dark-primary) !important; + background-color: #181819; +} + +.cbi-tabmenu > li > a, +.tabs > li > a { + color: #ccc; + + &: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: 0.18751rem solid var(--dark-primary) !important; +} + +.cbi-tabmenu > li[class~="cbi-tab"] { + background-color: #181819; + border-bottom: 0.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 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 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: 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; + } + + > del { + border-color: #c60000; + background-color: #896565; + } + + > var { + background-color: #333; + border-color: #666; + + ins { + background-color: #688668; + } + + del { + background-color: #896565; + } + } + } + } + + .uci-change-list { + > var { + background-color: #333; + border-color: #666; + + del { + background-color: #896565; + } + + ins { + background-color: #688668; + } + } + + > ins { + border-color: #00ad00; + background-color: #688668; + } + + > del { + border-color: #c60000; + background-color: #896565; + } + } + + .uci-change-list + .right { + .btn { + color: #ccc; + } + + .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 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; + } + + .btn { + white-space: normal !important; + background-color: darkseagreen; + } + + .alert-message { + background-color: transparent !important; + } + + .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; + + &: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 0.5rem 0 rgba(0, 0, 0, .35); + } + + +} + +[data-page=""], +[data-page="admin-dashboard"] { + .main-right > #maincontent { + .Dashboard { + color: #ccc !important; + + h3 { + color: #ccc; + } + + hr { + border-top: 1px solid rgba(255, 255, 255, 1); + } + + .dashboard-bg { + background-color: #333333; + } + + img.svgmonochrome { + filter: invert(90%); + } + + tr { + border-top: thin solid #4d4d4d; + + &:last-child { + border-bottom: thin solid #4d4d4d; + } + } + } + } +} + +[data-page="admin-system-fileassistant"] { + .fb-container .panel-container { + border-bottom-color: #3c3c3c !important; + } + + .fb-container td[class$="-icon"]::before { + filter: invert(0.7); + } + + 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; + + .developer-container { + background: transparent !important; + } + } + + .config-upload-content{ + background: #1e1e1e !important; + } + + .cbi-tabmenu::-webkit-scrollbar-thumb { + background-color: #5b5b5b; + } + + .cbi-tabmenu::-webkit-scrollbar-track { + background-color: rgba(60, 60, 60, 0.75); + } + + #tab { + border-color: #3c3c3c; + } + + #diag-rc-output > pre, + #dns-rc-output > pre { + color: #ccc; + border: 1px solid #3c3c3c !important; + background-color: #1e1e1e; + } + + img[src$="arrow-clockwise-light.svg"], + img[src$="wrench-light.svg"], + img[src$="eye-light.svg"] { + filter: invert(0.9); + } +} + +[data-page="admin-network-diagnostics"] { + .cbi-section { + background: #252526 !important; + } + + textarea { + background: transparent; + border-radius: 0.25rem; + color: #ccc; + border: 1px solid #3c3c3c !important; + } + + .tr > .td { + background-color: #252526 !important; + } +} + +[data-page="admin-network-network"] { + .ifacebox-head[style*="--zone-color-rgb: 144, 240, 144"] { + background-color: rgb(73, 126, 73) !important; + color: #ccc !important; + } + + .ifacebox-head[style*="--zone-color-rgb: 240, 144, 144;"] { + background-color: rgb(156, 79, 79) !important; + color: #ccc !important; + } + + .ifacebox-head[style*="--zone-color-rgb: 238, 238, 238;"] { + background-color: #666 !important; + } + + #modal_overlay > .modal.cbi-modal > div > p > textarea { + border: 1px solid #3c3c3c !important; + background-color: transparent !important; + } + + #modal_overlay div[data-tab="peers"] div[data-name="_peers"] .ifacebadge code { + color: #fff !important; + background-color: transparent !important; + } + + #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; + + strong { + color: #ccc !important; + } + } + + .zonebadge[style*="--zone-color-rgb:238, 238, 238;"] { + --zone-color-rgb: 112, 112, 112 !important; + + em { + color: #ccc !important; + } + } + + > table > .cbi-section-table-row[data-title]::before { + background-color: #252526 !important; + } + } +} + +[data-page="admin-network-network"], +[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; + + strong { + color: #ccc !important; + } + } + + .zonebadge[style*="--zone-color-rgb:144, 240, 144;"] { + --zone-color-rgb: 73, 126, 73 !important; + color: #ccc !important; + + strong { + color: #ccc !important; + } + } + + .zonebadge[style*="--zone-color-rgb:238, 238, 238;"] { + --zone-color-rgb: 112, 112, 112 !important; + + strong { + color: #ccc !important; + + + span { + color: #ccc !important; + } + } + } + } +} + +[data-page="admin-system-commands"], +[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: rgb(112, 112, 112); + color: #fff; +} diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/fonts.less b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/fonts.less new file mode 100644 index 0000000..afb98f8 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/fonts.less @@ -0,0 +1,38 @@ +// out: false + +// ========================================================================== +// CSS Custom Properties for Font Management +// ========================================================================== + +@font-face { + font-family: 'Google Sans'; + src: local('Google Sans'), + local('GoogleSans-Regular'), + url('../fonts/GoogleSans-Regular.woff2') format('woff2'), + url('../fonts/GoogleSans-Regular.woff') format('woff'); + font-weight: normal; + font-style: normal; + font-display: swap; +} + +/* Logo Font */ +@font-face { + font-family: 'TypoGraphica'; + src: local('TypoGraphica'), + url('../fonts/TypoGraphica.woff2') format('woff2'), + url('../fonts/TypoGraphica.woff') format('woff'); + font-weight: normal; + font-style: normal; + font-display: swap; +} + +/* Icon Font */ +@font-face { + font-family: 'argon'; + src: url('../fonts/argon.woff2') format('woff2'), + url('../fonts/argon.woff') format('woff'); + font-weight: normal; + font-style: normal; + font-display: swap; +} + diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/layout.less b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/layout.less new file mode 100644 index 0000000..0251acd --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/layout.less @@ -0,0 +1,605 @@ +// out: false +// ========================================================================== +// Layout Styles +// Main layout components for LuCI admin interface +// ========================================================================== + + +// 1. Main Container Layout +// ========================================================================== + +.main { + position: relative; + width: 100%; + height: 100%; + overflow-y: auto; + display: flex; + flex-direction: row; +} + +// 2. Left Sidebar Layout +// ========================================================================== + +.main-left { + width: 15rem; + height: 100%; + flex-shrink: 0; + z-index: 100; + overflow-x: auto; + word-break: break-word; + background-color: var(--menu-bg-color); + box-shadow: rgba(0, 0, 0, 0.75) 0px 0px 15px -5px; + transition: all 0.2s; + + // Sidebar Header + .sidenav-header { + padding: 1.5rem 0.5rem; + text-align: center; + + .brand { + display: block; + margin: 0 2rem; + font-size: 1.8rem; + font-family: "TypoGraphica"; + color: var(--primary); + text-decoration: none; + text-align: center; + cursor: default; + + .logo { + max-width: 100%; + height: auto; + } + } + } + + // Navigation Menu + .nav { + margin-top: 0.5rem; + + // Top-level navigation links + &>li>a:first-child { + display: block; + position: relative; + margin: 0.1rem 0.5rem; + padding: 0.675rem 0 0.675rem 2.5rem; + font-size: 1rem; + text-decoration: none; + border-radius: 0.25rem; + cursor: default; + transition: all 0.2s; + + // Active state + &.active { + color: #fff; + background: var(--primary); + + &::before { + color: #fff !important; + } + + &::after { + transform: rotate(90deg); + color: #fff !important; + } + } + + // Hover state + &:hover { + cursor: pointer; + color: #fff; + background: var(--primary); + + &::before { + color: #fff !important; + } + } + + // Icon before text + &::before { + position: absolute; + left: 0.8rem; + padding-top: 3px; + font-family: 'argon' !important; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + content: "\e915"; + color: var(--primary); + transition: all 0.3s; + } + } + + &>.slide>.menu::before { + transition: transform .1s ease-in-out; + } + + &>.slide>.menu.active::before { + transition: transform .2s ease-in-out; + } + + // Navigation list items + li { + padding: 0; + cursor: pointer; + user-select: none; + + a { + display: block; + color: var(--menu-color); + } + + // Collapsible menu items + &.slide { + padding: 0; + + ul { + display: none; + overflow: hidden; + } + + &:hover { + background: none; + } + + // Submenu container + .slide-menu { + margin: 0 0.5rem 0 2.5rem; + padding: 0rem 0.5rem; + + &.active { + display: block; + } + + li { + position: relative; + margin: 0; + border-radius: 0.25rem; + background: none; + list-style: none; + + a { + padding: 0.5rem 0rem; + text-decoration: none; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + // Hover indicator line + &::after { + position: absolute; + left: 0; + bottom: 0; + width: 0; + height: 2px; + content: ""; + background-color: var(--primary); + transition: all 0.2s; + } + + &:hover { + background: none; + + &::after { + width: 100%; + } + } + } + + // Active submenu item + .active { + background: none; + color: var(--menu-color); + + a { + color: var(--menu-color); + } + + &::after { + position: absolute; + left: 0; + bottom: 0; + width: 100%; + height: 2px; + content: ""; + background-color: var(--primary); + transition: all 0.2s; + } + + &:hover { + background: none; + + &::after { + width: 100%; + } + } + } + } + } + + // Main menu items + .menu { + display: block; + position: relative; + margin: 0.1rem 0.5rem; + padding: 0.675rem 0 0.675rem 2.5rem; + font-size: 1rem; + text-decoration: none; + border-radius: 0.25rem; + cursor: default; + transition: all 0.2s; + + // Active state + &.active { + color: #fff; + background: var(--primary); + + &::before { + color: #fff !important; + } + + &::after { + transform: rotate(90deg); + color: #fff !important; + } + } + + // Hover state + &:hover { + cursor: pointer; + color: #fff; + background: var(--primary); + + &::before { + color: #fff !important; + } + } + + // Icon before text + &::before { + position: absolute; + left: 0.8rem; + padding-top: 3px; + font-family: 'argon' !important; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + content: "\e915"; + color: var(--primary); + transition: all 0.3s; + } + + // Dropdown arrow + &::after { + position: absolute; + right: 0.5rem; + top: 0.8rem; + font-family: 'argon' !important; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + content: '\e90f'; + color: #ced4da; + text-rendering: auto; + transition: all 0.3s; + } + } + + // Menu-specific icons and colors + .menu[data-title="Status"]:before { + content: "\e906"; + color: var(--primary); + } + + .menu[data-title="System"]:before { + content: "\e90a"; + color: #fb6340; + } + + .menu[data-title="Services"]:before { + content: "\e909"; + color: #11cdef; + } + + .menu[data-title="NAS"]:before { + content: "\e90c"; + color: #f3a4b5; + } + + .menu[data-title="VPN"]:before { + content: "\e90b"; + color: #8965e0; + } + + .menu[data-title="Network"]:before { + content: "\e908"; + color: #8965e0; + } + + .menu[data-title="Bandwidth_Monitor"]:before { + content: "\e90d"; + color: #2dce89; + } + + .menu[data-title="Docker"]:before { + content: "\e911"; + color: #6699ff; + } + + .menu[data-title="Statistics"]:before { + content: "\e913"; + color: #8965e0; + } + + .menu[data-title="Control"]:before { + content: "\e912"; + color: var(--primary); + } + + .menu[data-title="Asterisk"]:before { + content: "\e914"; + color: #fb6340; + } + + // Logout link styling + a[data-title="Log_out"], + .food[data-title="Log_out"] { + &::before { + content: "\e907"; + color: #adb5bd; + } + } + } + } + + &[style*="overflow: hidden"]>.nav>.slide>.menu::before { + display: none; + } + + // Scrollbar Styling + &::-webkit-scrollbar { + width: 5px; + height: 1px; + } + + &::-webkit-scrollbar-thumb { + background-color: #f6f9fc; + } + + &::-webkit-scrollbar-track { + background-color: #fff; + } +} + +// 3. Right Content Area Layout +// ========================================================================== + +.main-right { + height: 100%; + flex-grow: 1; + overflow-x: hidden; + overflow-y: auto; + display: flex; + flex-direction: column; + transition: all 0.2s; + + // Main Content Container + &>#maincontent { + position: relative; + z-index: 50; + flex: 1; + display: flex; + flex-direction: column; + + &>.container { + margin: 0 1.25rem 1rem 1.25rem; + flex-grow: 1; + display: flex; + flex-direction: column; + gap: 1rem; + } + + // Dashboard Specific Styles + .Dashboard { + color: var(--gray-dark) !important; + + h3 { + color: var(--gray-dark); + } + + p { + margin-top: 3px; + margin-bottom: 3px; + } + + hr { + border-top: 1px solid rgba(0, 0, 0, 1); + } + + .dashboard-bg { + background-color: #fff; + } + + .settings-info { + padding-top: 1em; + padding-bottom: 1em; + + p span:nth-child(2) { + max-height: 18.5px; + top: 4px; + } + + .label { + font-size: 0.7rem; + padding: 0.2rem 0.6rem; + } + } + } + } +} + +// 4. Header Layout +// ========================================================================== + +header { + position: relative; + width: 100%; + padding: 0; + color: var(--header-color); + + // Primary background modifier + &.bg-primary { + background-color: var(--primary) !important; + } + + // Header extension background + &::after { + content: ""; + position: absolute; + width: 100%; + height: 2rem; + background-color: var(--primary) !important; + } + + // Header Content Container + .fill { + padding: 0.8rem 0; + display: flex; + border-bottom: 0px solid rgba(255, 255, 255, 0.08) !important; + + .container { + width: 100%; + height: 2rem; + padding: 0 1.25rem; + display: flex; + align-items: center; + + // Left section (brand and menu toggle) + .flex1 { + flex: 1; + + .showSide { + display: none; + font-size: 1.4rem; + color: #fff; + + &:hover { + text-decoration: none; + } + } + + .brand { + display: none; + padding-left: 1rem; + font-size: 1.5rem; + font-family: "TypoGraphica"; + color: #fff; + text-decoration: none; + cursor: default; + vertical-align: text-bottom; + } + } + + // Right section (status indicators) + .pull-right { + margin-top: 0rem; + float: right; + display: flex; + } + } + + // Status Indicators + .status { + span { + display: inline-block; + margin: 0 0.25rem; + padding: 0.3rem 0.8rem; + font-size: 0.875rem; + font-weight: bold; + white-space: nowrap; + text-decoration: none; + text-transform: uppercase; + text-shadow: none; + border-radius: 4px; + cursor: pointer; + transition: all 0.3s; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 2px 0 rgba(0, 0, 0, 0.12); + + &:last-child { + margin-right: 0; + } + } + + span[data-indicator="poll-status"] { + color: #fff; + } + + span[data-style="active"] { + background-color: var(--green); + } + + span[data-style="inactive"] { + color: #ffffff !important; + background-color: #32325d; + } + } + } +} + +// 5. Footer Layout +// ========================================================================== + +footer { + padding: 1rem; + font-size: 0.875rem; + color: #aaa; + text-align: right; + white-space: nowrap; + overflow: hidden; + + >a { + color: #aaa; + text-decoration: none; + } +} + + +// 6. View +// ========================================================================== +#view { + border-radius: 0.25rem; + display: flex; + flex-direction: column; + gap: 1rem; + + &>.spinning { + position: fixed; + top: 50%; + left: 50%; + transform: translateX(-50%) translateY(-50%); + padding: 1rem; + border-radius: 0.5rem; + background: #ffffff; + box-shadow: 0 0 1rem 0 rgba(136, 152, 170, .15); + } + + &>div:first-child { + display: flex; + flex-direction: column; + gap: 0.875rem; + + } +} \ No newline at end of file diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/normalize.less b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/normalize.less new file mode 100644 index 0000000..e80ea17 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/normalize.less @@ -0,0 +1,407 @@ +// out: false +// ========================================================================== +// Normalize.less +// Based on normalize.css for style reset and standardization +// ========================================================================== + +// 1. Global Reset +// ========================================================================== + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +// 2. Document Root Elements +// ========================================================================== + +html { + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +html, +body { + margin: 0; + padding: 0; + height: 100%; + font-family: var(--font-family-sans-serif); +} + +body { + background-color: var(--background-color); + color: var(--gray-dark); + -webkit-tap-highlight-color: transparent; + font-size: 0.875rem; +} + +// 3. Semantic Elements +// ========================================================================== + +main { + display: block; +} + +// 4. Heading Elements +// ========================================================================== + +.h1, +.h2, +.h3, +.h4, +.h5, +.h6, +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: inherit; + font-weight: normal; + line-height: 1.1 !important; + color: inherit; +} + +h1 { + font-size: 2rem; + margin: 0.67em 0; + padding-bottom: 0.5rem; + border-bottom: thin solid var(--lighter); +} + +h2 { + padding: 1rem 1.25rem; + font-size: 1.25rem; + font-weight: bold; + color: var(--gray-dark); + border-radius: 0.25rem; + background: var(--white); + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.03); +} + +h3 { + margin: 0; + padding: 0.8755rem 1.25rem; + font-size: 1.1rem; + font-weight: bold; + line-height: 1; + color: var(--gray-dark); + border-radius: 0.25rem; + background: var(--white); + display: block; + width: 100%; +} + +h4 { + margin: 0; + padding: 0.75rem 1.25rem; + font-size: 0.875rem; + font-weight: bold; + color: var(--gray-dark-400); + + em { + padding: 0 0.5rem; + } +} + +h5 { + margin: 2rem 0 0 0; + padding-bottom: 0.5rem; + font-size: 1rem; +} + +// 5. Text Elements +// ========================================================================== + +a { + background-color: transparent; +} + +abbr { + cursor: help; + text-decoration: underline; + color: var(--primary); +} + +abbr[title] { + border-bottom: none; + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +b, +strong { + font-weight: bolder; +} + +code, +kbd, +samp { + font-family: inherit; + font-size: inherit; + padding: 1px 3px; + color: var(--dark); + border-radius: 0.5rem; + background: var(--lighter); +} + +small { + font-size: 90%; + line-height: 1.42857143; + white-space: normal; +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +// 6. Horizontal Rules and Preformatted Text +// ========================================================================== + +hr { + box-sizing: content-box; + height: 0; + margin: 1rem 0; + overflow: visible; + opacity: 0.1; + border-color: var(--lighter); +} + +pre { + font-family: monospace, monospace; + font-size: 1em; + overflow: auto; +} + +// 7. Media Elements +// ========================================================================== + +img { + border-style: none; +} + +// 8. Form Elements +// ========================================================================== + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + font-size: 100%; + line-height: 1.15; + margin: 0; +} + +button, +input { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +// Button Styles +[type=button], +[type=reset], +[type=submit], +button { + -webkit-appearance: button; + appearance: button; +} + +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner, +button::-moz-focus-inner { + border-style: none; + padding: 0; +} + +[type=button]:-moz-focusring, +[type=reset]:-moz-focusring, +[type=submit]:-moz-focusring, +button:-moz-focusring { + outline: 1px dotted ButtonText; +} + +// Input Styles +[type=checkbox], +[type=radio] { + box-sizing: border-box; + padding: 0; +} + +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height: auto; +} + +[type=search] { + -webkit-appearance: textfield; + appearance: textfield; + outline-offset: -2px; +} + +[type=search]::-webkit-search-decoration { + -webkit-appearance: none; + appearance: none; +} + +::-webkit-file-upload-button { + -webkit-appearance: button; + appearance: button; + font: inherit; +} + +// checkbox style + +input[type="checkbox"] { + appearance: none !important; + -webkit-appearance: none !important; + border: 1px solid var(--primary); + + width: 1rem !important; + height: 1rem !important; + padding: 0; + cursor: pointer; + transition: all 0.2s; +} + +input[type="checkbox"]:checked { + border: 1px solid var(--primary); + background-image: url('data:image/svg+xml,%3csvg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 8 8\'%3e%3cpath fill=\'%23fff\' d=\'M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z\'/%3e%3c/svg%3e') !important; + background-color: var(--primary); + background-size: 70%; + background-repeat: no-repeat; + background-position: center; +} + +// Select Styles +select { + padding: 0.36rem 0.8rem; + color: var(--gray-dark); + border: thin solid var(--lighter); + background-color: var(--white); + background-image: none; +} + +// Textarea Styles +textarea { + padding: 0.25rem; + overflow: auto; + + &:focus-visible { + outline: none; + border: 1px solid var(--primary); + } +} + +// Fieldset Styles +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +legend { + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal; +} + +// 9. Interactive Elements +// ========================================================================== + +details { + display: block; +} + +summary { + display: list-item; +} + +template { + display: none; +} + +progress { + vertical-align: baseline; +} + +// 10. List Elements +// ========================================================================== + +ul { + line-height: normal; +} + +li { + list-style-type: none; +} + +// 11. State Styles +// ========================================================================== + +[disabled="disabled"] { + pointer-events: none; +} + + +::selection { + background-color: var(--primary); + color: var(--white); +} + +::placeholder { + color: var(--lighter); +} + +a:link, +a:visited, +a:active { + color: var(--primary); + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +// 12 tools +// ========================================================================== + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.nowrap:not(.td) { + white-space: nowrap; +} + +div[style="width:100%;height:300px;border:1px solid #000;background:#fff"] { + border: 0 !important; +} \ No newline at end of file diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/page-fix.less b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/page-fix.less new file mode 100644 index 0000000..34e9800 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/page-fix.less @@ -0,0 +1,1004 @@ +// out: false +// ========================================================================== +// Page Fix Styles +// Page-specific CSS fixes and customizations for LuCI admin interface +// ========================================================================== + +// 1. System Administration Pages +// ========================================================================== + +// System - Auto Reboot +[data-page="admin-system-autoreboot"] { + #cbi-autoreboot { + margin-top: 0; + } +} + +// System - System Settings +[data-page="admin-system-system"] { + .control-group { + gap: .875rem; + } + + .cbi-dynlist { + margin: 0.25rem 0; + } +} + +// System - Admin Password +[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 { + margin-left: 0; + color: var(--gray-dark); +} + +[data-page="admin-system-admin"], +[data-page="admin-system-admin-password"] { + .cbi-section-node { + padding: 1rem 0; + } +} + +// System - SSH Keys +[data-page="admin-system-admin-sshkeys"] { + .cbi-dynlist { + margin-left: 1rem; + } +} + +// System - Startup Scripts +[data-page="admin-system-startup"] { + #view { + &>div:first-child { + div[data-initialized="true"] { + margin-top: -0.4375rem; + } + } + } + + [data-tab-title] p { + margin-left: 0; + margin-bottom: 0; + display: flex; + align-items: center; + justify-content: center; + } + + textarea { + line-height: 1.25; + overflow-y: auto; + width: 100%; + min-height: 15rem; + margin: 0 1rem; + padding: 1rem; + resize: none; + color: #8898aa; + border-radius: 0.25rem; + border: 1px solid #dee2e6; + + &:focus-visible { + outline: none; + box-shadow: none; + border: 1px solid var(--primary); + } + } +} + +// System - Crontab +[data-page="admin-system-crontab"] { + #view p { + textarea { + line-height: 1.25; + overflow-y: hidden; + width: 100%; + min-height: 15rem; + padding: 1rem; + resize: none; + background-color: transparent; + background: var(--white); + outline: none; + color: #8898aa; + border-radius: 0.25rem; + border: 1px solid #dee2e6; + transition: all 0.2s ease; + + &:focus-visible { + outline: none; + box-shadow: none; + border: 1px solid var(--primary); + } + } + } +} + +// System - Crontab Helper +[data-page="admin-system-crontabhelper"] { + .crontab-row { + .dropdown-container { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.5rem; + + div { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.5rem; + } + } + } +} + +// System - Partexp +[data-page="admin-system-partexp-global"] { + .cbi-section { + padding: 1rem 0; + } +} + +// System - Attended Sysupgrade +[data-page="admin-system-attendedsysupgrade"] #view .cbi-button { + margin-left: 0 !important; + margin-top: 1rem !important; +} + +[data-page="admin-system-attendedsysupgrade-configuration"] { + .cbi-map { + .cbi-map-descr { + padding-bottom: 0; + } + } +} + +// System - Flash Firmware +[data-page="admin-system-flash"] { + .cbi-value { + padding: 0 1rem; + } + + .cbi-section { + .cbi-section { + margin-top: 0; + } + } + + .cbi-map-tabbed { + border-radius: 0.25rem; + } + + .cbi-section-node { + padding-top: 0; + padding-bottom: 0.5rem; + } + + legend { + font-size: 1.2rem; + width: 100%; + display: block; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); + line-height: 1.5; + margin-bottom: 0; + letter-spacing: 0.1rem; + color: #32325d; + font-weight: bold; + padding: 1rem 0 1rem 1rem; + } + + .cbi-section-descr { + font-weight: 600; + padding: 1rem 0 1rem 1rem; + color: #525f7f; + } + + .cbi-page-actions { + padding: 0rem 1rem 1rem 0rem; + } + + .modal { + label>input[type="checkbox"] { + top: -0.25rem; + } + + .btn { + white-space: normal !important; + } + } + + .modal label>input[type="checkbox"] { + vertical-align: text-top; + top: auto; + } +} + +// System - File Transfer +[data-page="admin-system-filetransfer"] { + #cbi-upload { + margin-top: 0; + } + + .cbi-section-table { + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.03); + } +} + +// System - File Assistant +[data-page="admin-system-fileassistant"] { + #upload-toggle { + display: none !important; + } + + .fb-container .panel-title { + padding: 0.5rem 0.75rem !important; + } + + .cbi-section.fb-container { + padding: 0.5rem; + + label.cbi-value-title { + line-height: 1.5rem; + padding: 0.5rem 0.75rem; + width: 60px; + text-align: left; + } + + div.cbi-value-field { + width: 100%; + display: block; + padding-left: 60px; + } + + div#list-content { + table.cbi-section-table { + + thead, + tbody { + td.cbi-section-table-cell { + width: 232px; + } + } + } + + tbody { + tr:nth-child(1) { + td.parent-icon { + strong { + margin-left: 0 !important; + } + } + } + + td.cbi-value-field.file-icon, + td.cbi-value-field.folder-icon { + strong { + vertical-align: middle; + margin-left: 5px; + } + } + } + } + } + + .fb-container .panel-container { + border-bottom-color: #dee2e6; + display: flex; + + .panel-title { + flex: 1; + } + } + + .fb-container .upload-container { + display: flex !important; + + .upload-file { + flex: 1; + margin-right: 0 !important; + } + } +} + +// System - Package Manager (Software) +[data-page="admin-system-opkg"] { + h2 { + margin-left: 0; + color: var(--gray-dark); + } + + input[name="filter_i18n"] { + top: 2px; + vertical-align: text-top; + } + + div.btn { + line-height: 3; + display: inline; + padding: 0.3rem 0.6rem; + } + + #maincontent>.container { + margin: 0 1.25rem 1rem 1.25rem; + margin-bottom: 1rem; + } +} + +[data-page="admin-system-package-manager"] { + .controls { + div:nth-child(5) { + >label { + margin-bottom: 5px; + } + + >div { + label { + margin-top: 1rem; + + input { + top: -2px; + right: 0; + vertical-align: middle; + } + } + } + } + } +} + +// System - Power Management +[data-page="admin-system-reboot"] { + p { + padding-left: 1.5rem; + } + + p>span { + position: relative; + top: 0.1rem; + left: 1rem; + } + + .cbi-button { + background: #fb6340 !important; + border-color: #fb6340 !important; + margin-left: 0 !important; + } + + .cbi-button.cbi-button-action.important { + align-self: flex-end; + } +} + +/* applyreboot fix */ +#applyreboot-container { + margin: 2rem; +} + +#applyreboot-section { + line-height: 300%; + margin: 2rem; +} + +[data-page="admin-system-poweroff"] { + .container { + h2+br+p { + margin-bottom: 1rem; + padding-left: 1.5rem; + } + } +} + +[data-page="admin-system-poweroffdevice"] { + .container { + h2 { + margin: 0; + } + + h2+p { + margin-bottom: 1rem; + padding-left: 1.5rem; + } + + button+div { + display: none; + } + } + + + .btn.cbi-button.cbi-button-negative { + align-self: flex-end; + } +} + +// 2. Network Configuration Pages +// ========================================================================== + +// Network - Interfaces +[data-page="admin-network-network"] { + .cbi-value-field { + .cbi-dynlist { + padding: 0 !important; + } + } + + .td>.ifacebadge>.cbi-tooltip-container { + display: flex; + + img { + vertical-align: middle; + } + } + + div[data-name="_gen_server_keypair"], + div[data-name="_gen_peer_keypair"], + div[data-name="_gen_psk"] { + .cbi-value-title { + height: 2.4rem; + } + } + + #modal_overlay>.modal.cbi-modal>div>p>textarea { + height: 20em !important; + border: 1px solid #dee2e6 !important; + border-radius: 4px; + } +} + +// Network - DHCP and DNS +[data-page="admin-network-dhcp"] { + .cbi-value { + padding: 0; + } + + [data-tab-active="true"] { + padding: 1rem 1rem !important; + } +} + +// Network - Diagnostics +[data-page="admin-network-diagnostics"] { + .table { + box-shadow: none; + } + + .cbi-section { + padding: 1rem; + font-family: monospace; + background: #fff !important; + } + + textarea { + background: transparent; + border-radius: 0.25rem; + color: #8898aa; + border: 1px solid #dee2e6; + padding: 0.5rem; + } + + .tr { + display: flex; + flex-direction: row; + + .td { + background-color: #fff !important; + border-bottom: 1px solid #dee2e6 !important; + display: flex; + flex-direction: row; + align-items: center; + flex: 1; + + input { + margin: 0 !important; + border-right: none !important; + border-bottom-right-radius: 0 !important; + border-top-right-radius: 0 !important; + } + + .cbi-dropdown, + .cbi-button { + height: 2.5rem; + border-left: none !important; + border-bottom-left-radius: 0 !important; + border-top-left-radius: 0 !important; + + .more { + display: block; + width: 1px; + height: 100%; + overflow: hidden; + text-indent: 5000px; + background-color: var(--white) + } + } + } + } + + + .cbi-dropdown { + .open { + color: var(--white); + } + } +} + +// Network - Firewall +[data-page="admin-network-firewall-custom"], +[data-page="admin-status-routes"] { + #view { + p { + padding: 0 1.25rem; + + textarea { + padding: 1rem; + border-radius: 0.25rem; + } + } + + &>h3 { + border-radius: 0.25rem 0.25rem 0 0; + } + + .cbi-tabmenu+div { + margin-top: -0.5rem; + } + } +} + +// 3. Status Pages +// ========================================================================== + +.cbi-section.fade-in { + .cbi-title { + position: relative; + + > div:last-child { + position: absolute; + right: 1.25rem; + top: 0; + + span { + font-size: 0; + background: none!important; + color: #ced4da!important; + + &:after { + transition: all .3s; + font-family: 'argon' !important; + content: '\e90f'; + font-size: 1.1rem; + padding: .8755rem 0; + position: absolute; + right: 0; + } + + &[data-style=inactive]:after { + transform: rotate(90deg); + } + } + } + } +} + +// Status - Overview +[data-page="admin-status"], +[data-page="admin-status-overview"] { + #view > div:first-child { + gap: 0 !important; + } +} + +// Status - IPTables +[data-page="admin-status-iptables"] { + .right { + margin-bottom: 0 !important; + } +} + +// Status - NFTables +[data-page="admin-status-nftables"] { + .nft-chain-hook { + padding: 0.5rem 1.25rem; + } +} + +// Status - Network Bandwidth Monitor +[data-page="admin-nlbw-display"] { + .cbi-section[data-tab="export"] { + padding: 1.5rem !important; + } +} + +[data-page="admin-nlbw-backup"] { + form { + padding-left: 1.5rem; + } +} + +// 4. Services Pages +// ========================================================================== + +// Services - Dynamic DNS +[data-page="admin-services-ddns"] { + #syslog { + overflow: auto; + font-size: 12px !important; + } +} + +// Services - TTY Daemon +[data-page="admin-services-ttyd"] { + .container { + display: flex; + flex-direction: column; + } + + #view { + flex: 1; + + iframe { + height: 100%; + } + } +} + +// Services - Dockerman +#cbi-dockerd { + .cbi-section { + box-sizing: border-box; + padding: 16px; + } + + .cbi-section.cbi-tblsection { + padding: 0; + } + +} + + +#cbi-docker { + .cbi-section { + .cbi-section-node { + box-sizing: border-box; + padding: 16px; + } + } +} + +// Services - NPC +[data-page="admin-services-npc"] { + div[id="cbid.npc.config.vkey"] { + white-space: normal; + + input[id="widget.cbid.npc.config.vkey"][type="password"] { + margin-top: 0; + margin-bottom: 0; + } + + .cbi-button { + margin: 0; + border: none; + } + } + + div[id^="cbid.npc."][id$=".server_addr"]:not([id="cbid.npc.config.server_addr"]), + div[id^="cbid.npc."][id$=".vkey"]:not([id="cbid.npc.config.vkey"]), + div[id^="cbid.npc."][id$=".protocol"]:not([id="cbid.npc.config.protocol"]), + div[id^="cbid.npc."][id$=".dns"]:not([id="cbid.npc.config.dns"]) { + +br { + display: none; + } + } + + div.cbi-value.nowrap { + white-space: normal; + } +} + +// Services - OpenClash +[data-page^="admin-services-openclash"] { + .oc { + --bg-light: #fff; + --bg-gray: #fff; + border-radius: 8px; + + .developer-container { + background: transparent; + } + } + + #cbi-openclash>fieldset { + background: none; + padding: 0; + + >table>tbody>tr>td { + border: none; + padding: 0; + } + + .main-card { + border: none; + box-shadow: none; + padding: 0 10px 10px 10px; + background: transparent; + } + + .myip-main-card { + margin: 0; + padding: 10px; + border: none; + background: transparent; + + .myip-section-title { + margin: 0; + border-width: 1px; + } + } + } + + .sub-card .card-title { + margin-top: 5px; + } + + .oc .main-cards-container { + margin: 0 !important; + gap: 0 !important; + } + + .oc .config-file-bottom { + margin-bottom: 5px; + + .card-actions { + margin-bottom: 2px !important; + } + } + + .oc .card-content { + align-items: center !important; + justify-content: center !important; + } + + .oc .card-controls { + align-self: center; + } + + .oc .core-main-controls { + justify-content: center !important; + } + + .oc .plugin-toggle-container { + margin-left: inherit !important; + } + + .oc .core-status-toggle { + flex: 0 !important; + min-width: auto !important; + } + + .oc .config-upload-content { + background: #fff !important; + } + + .oc .subscription-info-container { + background: transparent !important; + } + + .cbi-tabmenu>li { + border-right: none !important; + margin: 0 0.4rem 0 0 !important; + + &:last-child { + margin-right: 0 !important; + } + } + + #tab-content .dom { + padding: 0 1rem 1rem 1rem; + } + + .cbi-input-file { + padding: 0.2813rem; + width: 15rem !important; + } + + [id="container.openclash.config.debug"] fieldset { + border: none !important; + padding: 1rem !important; + } + + #diag-rc-output>pre, + #dns-rc-output>pre { + font-size: 0.875rem; + color: #8898aa; + border: 1px solid #dee2e6; + background-color: transparent; + border-radius: 0.25rem; + font-family: 'Google Sans' !important; + box-shadow: none; + } + + #debug-rc-output>textarea { + font-family: 'Google Sans' !important; + } + + .CodeMirror { + font-size: inherit; + font-family: 'Google Sans' !important; + } + + .cbi-button-up, + .cbi-button-down { + padding: 0.8rem 1.5rem; + background-color: #f1f1f1; + font-size: 0; + } + + select#CORE_VERSION, + select#RELEASE_BRANCH { + width: auto; + } +} + +// 5. VPN Pages +// ========================================================================== + +// VPN - Passwall +[data-page="admin-vpn-passwall"] h4 { + background: transparent; +} + +/* openvpn bug fix */ +.OpenVPN a { + line-height: initial !important; +} + + +// 6. Other Pages +// ========================================================================== + +// wireless +/* wireless overview */ +#cbi-wireless { + >#wifi_assoclist_table { + >.tr { + box-shadow: inset 1px -1px 0 #ddd, inset -1px -1px 0 #ddd; + + &.placeholder { + >.td { + right: 2rem; + bottom: 2rem; + left: 2rem; + border-top: thin solid #ddd !important; + } + } + + &.table-titles { + box-shadow: inset 1px 0 0 #ddd, inset -1px 0 0 #ddd; + + >.th { + border-bottom: thin solid #ddd; + box-shadow: 0 -1px 0 0 #ddd; + } + } + } + } +} + +#wifi_assoclist_table { + >.tr { + >.td[data-title="RX Rate / TX Rate"] { + width: 23rem; + } + } +} + +/* samba */ +#cbi-samba [data-tab="template"] { + .cbi-value-field { + display: block; + } + + .cbi-value-title { + width: auto; + padding-bottom: .6rem; + } +} + +/* fix status */ +.node-status-overview>.main fieldset:nth-child(4) .td:nth-child(2), +.node-status-processes>.main .table .tr .td:nth-child(3) { + white-space: normal; +} + +div[style*="display:grid;grid-template-columns:repeat"] { + display: flex !important; + justify-content: space-evenly !important; + flex-wrap: wrap; + + .ifacebox { + text-align: center; + flex-basis: 100px; + + .ifacebox-body { + font-size: 0.7rem; + padding: 0.875rem; + + .cbi-tooltip-container { + font-size: inherit !important; + } + } + } +} + +/* firewall */ +#iptables { + margin: 0; +} + +.Firewall form { + margin: 2rem 2rem 0 0; + padding: 0; + box-shadow: none; +} + +#cbi-firewall-redirect, +#cbi-network-switch_vlan, +#cbi-firewall-zone { + table { + * { + font-size: small; + } + + input[type="text"] { + width: 5rem; + } + + select { + min-width: 3.5rem; + } + } +} + +#cbi-network-switch_vlan { + + .th, + .td { + flex-basis: 12%; + } + + .table { + display: block; + } + + .td { + width: 100%; + } +} + +#cbi-firewall-zone { + .table { + display: block; + } + + .td { + width: 100%; + } +} + +[data-page^="admin-system-commands"] .panel-title, +[data-page^="command-cfg"] .mobile-hide, +[data-page^="command-cfg"] .showSide { + display: none; +} + +// overview & mwan3 +#mwan3-service-status { + display: flex; + justify-content: center; + align-items: center; + flex-wrap: wrap; +} + +#mwan3-service-status > .alert-message { + position: static; + transform: none; +} diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/pure-min.less b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/pure-min.less new file mode 100644 index 0000000..c33828d --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/pure-min.less @@ -0,0 +1,245 @@ +// out: false +/** +Pure v3.0.0 +Copyright 2013 Yahoo! +Licensed under the BSD License. +https://github.com/pure-css/pure/blob/master/LICENSE +*/ +/** +normalize.css v | MIT License | https://necolas.github.io/normalize.css/ +Copyright (c) Nicolas Gallagher and Jonathan Neal +*/ +/** normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ + +.pure-g { + display: flex; + flex-flow: row wrap; + align-content: flex-start +} + +.pure-u { + display: inline-block; + vertical-align: top +} + +.pure-u-1, +.pure-u-1-1, +.pure-u-1-12, +.pure-u-1-2, +.pure-u-1-24, +.pure-u-1-3, +.pure-u-1-4, +.pure-u-1-5, +.pure-u-1-6, +.pure-u-1-8, +.pure-u-10-24, +.pure-u-11-12, +.pure-u-11-24, +.pure-u-12-24, +.pure-u-13-24, +.pure-u-14-24, +.pure-u-15-24, +.pure-u-16-24, +.pure-u-17-24, +.pure-u-18-24, +.pure-u-19-24, +.pure-u-2-24, +.pure-u-2-3, +.pure-u-2-5, +.pure-u-20-24, +.pure-u-21-24, +.pure-u-22-24, +.pure-u-23-24, +.pure-u-24-24, +.pure-u-3-24, +.pure-u-3-4, +.pure-u-3-5, +.pure-u-3-8, +.pure-u-4-24, +.pure-u-4-5, +.pure-u-5-12, +.pure-u-5-24, +.pure-u-5-5, +.pure-u-5-6, +.pure-u-5-8, +.pure-u-6-24, +.pure-u-7-12, +.pure-u-7-24, +.pure-u-7-8, +.pure-u-8-24, +.pure-u-9-24 { + display: inline-block; + letter-spacing: normal; + word-spacing: normal; + vertical-align: top; + text-rendering: auto +} + +.pure-u-1-24 { + width: 4.1667% +} + +.pure-u-1-12, +.pure-u-2-24 { + width: 8.3333% +} + +.pure-u-1-8, +.pure-u-3-24 { + width: 12.5% +} + +.pure-u-1-6, +.pure-u-4-24 { + width: 16.6667% +} + +.pure-u-1-5 { + width: 20% +} + +.pure-u-5-24 { + width: 20.8333% +} + +.pure-u-1-4, +.pure-u-6-24 { + width: 25% +} + +.pure-u-7-24 { + width: 29.1667% +} + +.pure-u-1-3, +.pure-u-8-24 { + width: 33.3333% +} + +.pure-u-3-8, +.pure-u-9-24 { + width: 37.5% +} + +.pure-u-2-5 { + width: 40% +} + +.pure-u-10-24, +.pure-u-5-12 { + width: 41.6667% +} + +.pure-u-11-24 { + width: 45.8333% +} + +.pure-u-1-2, +.pure-u-12-24 { + width: 50% +} + +.pure-u-13-24 { + width: 54.1667% +} + +.pure-u-14-24, +.pure-u-7-12 { + width: 58.3333% +} + +.pure-u-3-5 { + width: 60% +} + +.pure-u-15-24, +.pure-u-5-8 { + width: 62.5% +} + +.pure-u-16-24, +.pure-u-2-3 { + width: 66.6667% +} + +.pure-u-17-24 { + width: 70.8333% +} + +.pure-u-18-24, +.pure-u-3-4 { + width: 75% +} + +.pure-u-19-24 { + width: 79.1667% +} + +.pure-u-4-5 { + width: 80% +} + +.pure-u-20-24, +.pure-u-5-6 { + width: 83.3333% +} + +.pure-u-21-24, +.pure-u-7-8 { + width: 87.5% +} + +.pure-u-11-12, +.pure-u-22-24 { + width: 91.6667% +} + +.pure-u-23-24 { + width: 95.8333% +} + +.pure-u-1, +.pure-u-1-1, +.pure-u-24-24, +.pure-u-5-5 { + width: 100% +} +.col-1 { + flex: 1 1 30px !important; +} + +.col-2 { + flex: 2 2 60px !important; +} + +.col-3 { + flex: 3 3 90px !important; +} + +.col-4 { + flex: 4 4 120px !important; +} + +.col-5 { + flex: 5 5 150px !important; +} + +.col-6 { + flex: 6 6 180px !important; +} + +.col-7 { + flex: 7 7 210px !important; +} + +.col-8 { + flex: 8 8 240px !important; +} + +.col-9 { + flex: 9 9 270px !important; +} + +.col-10 { + flex: 10 10 300px !important; +} \ No newline at end of file diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/responsive.less b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/responsive.less new file mode 100644 index 0000000..118bdb6 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/responsive.less @@ -0,0 +1,610 @@ +// out: false + +// ========================================================================== +// Responsive Styles +// Mobile-first responsive design for LuCI admin interface +// ========================================================================== + +// 1. Browser-Specific Fixes +// ========================================================================== + +// Internet Explorer Specific Fixes +@media all and (-ms-high-contrast: none) { + .main>.main-left>.nav>.slide>.menu::before { + top: 30.25%; + } + + .main>.main-left>.nav>li:last-child::before { + top: 20%; + } + + .showSide::before { + top: -12px; + } +} + +// 2. Large Desktop Screens (1600px and below) +// ========================================================================== + +@media screen and (max-width: 1600px) { + + // Header adjustments + header>.fill>.container>#logo { + margin: 0 2.5rem 0 0.5rem; + } + + // Sidebar width + .main-left { + width: calc(0% + 13rem); + } + + // Button and label sizing + .btn:not(button), + .label { + padding: 0.5rem 0.75rem; + } + + // Form field sizing + .cbi-value-title { + width: 15rem; + padding-right: 0.6rem; + } + + .cbi-value-field .cbi-dropdown, + .cbi-value-field .cbi-input-select, + .cbi-value input[type="text"], + .cbi-value input[type="password"], + .cbi-value textarea { + min-width: 18rem; + } + + // Specific component adjustments + #cbi-firewall-zone .cbi-input-select { + min-width: 9rem; + } + + .cbi-input-textarea { + font-size: small; + } + + .node-admin-status>.main fieldset li>a { + padding: 0.3rem 0.6rem; + } +} + +// 3. Standard Desktop Screens (1366px and below) +// ========================================================================== + +@media screen and (max-width: 1366px) { + + // Header adjustments + header>.fill>.container { + cursor: default; + } + + // Sidebar width + .main-left { + width: calc(0% + 13rem); + } + + // Tab styling + .tabs>li>a, + .cbi-tabmenu>li>a { + padding: 0.2rem 0.8rem; + } + + // Panel and table adjustments + .panel-title { + font-size: 1.1rem; + padding-bottom: 1rem; + } + + table { + width: 100% !important; + } + + .table .cbi-input-text { + width: 100%; + } + + // Form field sizing + .cbi-value-field .cbi-dropdown, + .cbi-value-field .cbi-input-select, + .cbi-value input[type="text"], + .cbi-value input[type="password"] { + min-width: 16rem; + } + + #cbi-firewall-zone .cbi-input-select { + min-width: 5.5rem; + } + + // Navigation font sizes + .main>.main-left>.nav>li, + .main>.main-left>.nav>li>a, + .main .main-left .nav>li>a:first-child, + .main>.main-left>.nav>.slide>.menu, + .main>.main-left>.nav>li>[data-title="Log_out"] { + font-size: 0.9rem; + } + + .main>.main-left>.nav>.slide>.slide-menu>li>a { + font-size: 0.875rem; + } + + // Modal adjustments + #modal_overlay { + top: 0rem; + } + + // Page-specific table fixes + [data-page="admin-network-firewall-forwards"] .table:not(.cbi-section-table) { + display: block; + } + + [data-page="admin-network-firewall-forwards"] .table:not(.cbi-section-table), + [data-page="admin-network-firewall-rules"] .table:not(.cbi-section-table), + [data-page="admin-network-hosts"] .table, + [data-page="admin-network-routes"] .table { + overflow-y: visible; + } + + // Button sizing + .btn:not(button), + .cbi-button { + font-size: 0.875rem; + } +} + +// 4. Small Desktop/Large Tablet (1152px and below) +// ========================================================================== + +@media screen and (max-width: 1152px) { + + // Header adjustments + header>.fill>.container>#logo { + display: none; + } + + header>.fill>.container>.brand { + position: relative; + } + + // Layout adjustments + html, + .main { + overflow-y: visible; + } + + .main>.loading>span { + top: 25%; + } + + .main-left { + width: calc(0% + 13rem); + } + + // Login page specific + body:not(.logged-in) .showSide { + visibility: hidden; + width: 0; + margin: 0; + } + + .node-main-login>.main .cbi-value-title { + text-align: left; + } + + // Form field adjustments + .cbi-value-title { + width: 12rem; + padding-right: 1rem; + } + + .cbi-value-field .cbi-dropdown, + .cbi-value-field .cbi-input-select, + .cbi-value input[type="text"] { + width: 16rem; + min-width: 16rem; + } + + // Password field specific sizing + .cbi-value input[name^="pw"], + .cbi-value input[data-update="change"]:nth-child(2) { + width: 13rem !important; + min-width: 13rem; + } + + // Code output adjustments + #diag-rc-output>pre, + #command-rc-output>pre, + [data-page="admin-services-wol"] .notice code { + font-size: 1rem; + } + + // Table responsive behavior + .table { + display: block; + } + + .Interfaces .table { + overflow-x: hidden; + } + + #packages.table { + display: grid; + } + + // Table row adjustments + .tr { + display: flex; + flex-direction: row; + flex-wrap: wrap; + } + + .Overview .table[width="100%"]>.tr { + flex-wrap: nowrap; + } + + .tr.placeholder { + border-bottom: thin solid #ddd; + } + + .tr.placeholder>.td, + #cbi-firewall .tr>.td, + #cbi-network .tr:nth-child(2)>.td, + .cbi-section #wifi_assoclist_table .tr>.td { + border-top: 0; + } + + // Table cell adjustments + .th, + .td { + display: inline-block; + align-self: flex-start; + flex: 2 2 10%; + text-overflow: ellipsis; + word-wrap: break-word; + } + + .td select, + .td input[type="text"] { + width: 100%; + word-wrap: normal; + } + + .td [data-dynlist]>input, + .td input.cbi-input-password { + width: calc(100% - 1.5rem); + } + + .td[data-type="button"], + .td[data-type="fvalue"] { + flex: 1 1 12.5%; + text-align: left; + } + + .th.cbi-value-field, + .td.cbi-value-field, + .th.cbi-section-table-cell, + .td.cbi-section-table-cell { + flex-basis: auto; + padding-top: 1rem; + } + + // Section table adjustments + .cbi-section-table-row { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-between; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 2px 0 rgba(0, 0, 0, 0.12); + } + + .td.cbi-value-field, + .cbi-section-table-cell { + display: inline-block; + flex: 10 10 auto; + flex-basis: 50%; + text-align: center; + } + + .td.cbi-section-actions { + vertical-align: bottom; + } + + // Hide table headers on mobile + .tr.table-titles, + .tr.cbi-section-table-titles, + .tr.cbi-section-table-descr { + display: none; + } + + .tr[data-title]::before, + .tr.cbi-section-table-titles.named::before { + font-size: 0.9rem; + display: block; + flex: 1 1 100%; + border-bottom: thin solid rgba(0, 0, 0, 0.26); + background: #e9ecef; + } + + .td[data-title], + [data-page^="admin-status-realtime"] .td[id] { + text-align: left; + } + + .td[data-title]::before { + display: block; + } + + // Button spacing + .cbi-button+.cbi-button { + margin-left: 0; + } + + .td.cbi-section-actions>*>*, + .td.cbi-section-actions>*>form>* { + margin: 2.1px 3px; + } + + // Firewall form adjustments + .Firewall form { + position: static !important; + margin: 0 0 2rem 0; + padding: 2rem; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 2px 0 rgba(0, 0, 0, 0.12); + + input { + width: 100% !important; + margin: 0; + margin-top: 1rem; + } + } + + .Firewall .center, + .Firewall .center::before { + text-align: left !important; + } + + // Button sizing + .btn:not(button), + .cbi-button { + font-size: 0.875rem; + } +} + +// 5. Tablet Portrait (768px and below) +// ========================================================================== + +@media screen and (max-width: 768px) { + + // Base font size + body { + font-size: 0.875rem; + } + + // Progress bar adjustments + .cbi-progressbar::after { + font-size: 0.6rem; + } + + // Mobile sidebar behavior + .main-left { + position: fixed; + z-index: 100; + width: 0; + + &.active { + width: 13rem; + } + } + + .main-right { + width: 100%; + + &.active { + overflow-y: hidden; + } + } + + .darkMask.active { + display: block; + } + + // Mobile menu toggle + .showSide { + padding: 0.1rem; + position: relative; + z-index: 99; + display: inline-block !important; + + &::before { + font-family: 'argon' !important; + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + content: "\e20e"; + font-size: 1.7rem; + } + } + + // Brand visibility + header>.fill>.container>.flex1>.brand { + display: inline-block; + } + + // Navigation font size + .main>.main-left>.nav>.slide>.slide-menu>li>a { + font-size: 0.875rem; + } +} + +// 6. Mobile Portrait (600px and below) +// ========================================================================== + +@media screen and (max-width: 600px) { + + // Hide mobile elements + .mobile-hide { + display: none; + } + + // Content margins + #maincontent>.container { + margin: 0 1rem 1rem 1rem; + } + + // Form adjustments + .cbi-value-title { + text-align: left; + } + + .cbi-dynlist p { + padding: 0.5rem 1rem; + } + + // Prevent horizontal scroll + body { + overflow-x: hidden; + } + + // Login page adjustments + .node-main-login .main .main-right #maincontent .container .cbi-map .cbi-section .cbi-section-node .cbi-value .cbi-value-field { + width: 16rem; + } + + .node-main-login footer { + display: none; + } + + // Tab scrollbar hiding + .tabs, + .cbi-tabmenu { + &::-webkit-scrollbar { + width: 0px; + height: 0px; + } + } + + // Form field layout + .cbi-value-field, + .cbi-value-description { + display: block !important; + padding-left: 0 !important; + padding-right: 0 !important; + } + + [data-page="admin-system-admin-password"] .cbi-value-field { + display: table-cell !important; + } + + // Modal adjustments + .modal.cbi-modal { + max-width: 100%; + max-height: none; + } + + .modal { + display: flex; + align-items: center; + flex-wrap: wrap; + width: 100%; + min-width: 270px; + max-width: 600px; + min-height: 32px; + margin: 5em auto; + padding: 1em; + border-radius: 3px !important; + background: #fff; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 2px 0 rgba(0, 0, 0, 0.12); + } + + // Dropdown adjustments + .cbi-dropdown[open]>ul.dropdown { + margin-bottom: 1rem; + } + + // Login page footer + .login-page .login-container footer { + display: none; + } +} + +// 7. Small Mobile (480px and below) +// ========================================================================== + +@media screen and (max-width: 480px) { + + // Hide mobile elements + .mobile-hide { + display: none; + } + + // Interface box adjustments for overview page + div[style*="display:grid;grid-template-columns:repeat"] { + .ifacebox { + flex-basis: 80px; + + .ifacebox-body { + padding: 0.875rem 0.5rem; + font-size: 0.6rem; + } + } + } + + // Login page mobile adjustments + .login-page .login-container { + margin-left: 0rem !important; + width: 100%; + + .login-form { + .form-login { + .input-group { + &::before { + color: #525461; + } + + input { + color: #525461; + border-bottom: white 1px solid; + border-bottom: var(--white) 1px solid; + border-radius: 0; + } + } + } + } + } +} + +// 8. Desktop Scrollbar Styling (600px and above) +// ========================================================================== + +@media screen and (min-width: 600px) { + ::-webkit-scrollbar { + width: 10px; + height: 10px; + } + + ::-webkit-scrollbar, + ::-webkit-scrollbar-corner { + background: transparent; + } + + ::-webkit-scrollbar-thumb { + background: var(--primary); + border-radius: 10px; + + &:hover { + background: var(--primary); + } + + &:active { + background: var(--primary); + } + } +} \ No newline at end of file diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/sysauth.less b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/sysauth.less new file mode 100644 index 0000000..7a4a755 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/less/sysauth.less @@ -0,0 +1,257 @@ +// out: false + +// ========================================================================== +// Login Page Styles +// Optimized with LESS best practices +// ========================================================================== + +// Mixins for common patterns +.flex-center() { + display: flex; + align-items: center; + justify-content: center; +} + +.absolute-full() { + position: absolute; + top: 0; + left: 0; + height: 100vh; + width: 100vw; +} + +.icon-base() { + font-family: 'argon' !important; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.login-page { + display: flex; + height: 100%; + flex-direction: column; + + // Background video container + .video { + .absolute-full(); + .flex-center(); + background-color: var(--darker); + overflow: hidden; + + video { + width: 100%; + height: auto; + } + } + + // Volume control button + .volume-control { + position: fixed; + top: 1rem; + right: 1rem; + width: 1.5rem; + height: 1.5rem; + z-index: 5000; + cursor: pointer; + background: url(../img/volume_high.svg) no-repeat center/contain; + + &.mute { + background-image: url(../img/volume_off.svg); + } + } + + // Main background image + .main-bg { + .absolute-full(); + background: url(../img/blank.png) no-repeat center/cover; + transition: all 0.5s ease; + } + + // Login container + .login-container { + z-index: 10; + margin-left: 5%; + display: flex; + height: 100vh; + width: 26rem; + flex-direction: column; + + background-color: var(--white); + backdrop-filter: blur(var(--blur-radius)); + background-color: rgba(244, 245, 247, var(--blur-opacity)); + box-shadow: rgba(0, 0, 0, 0.75) 0 0 35px -5px; + + // Login form + .login-form { + .absolute-full(); + display: flex; + flex-direction: column; + align-items: center; + max-width: 26rem; + + + // Brand/Logo section + .brand { + display: flex; + align-items: center; + justify-content: center; + margin: 50px auto 100px 50px; + color: var(--default); + text-decoration: none; + + .icon { + width: 50px; + height: auto; + margin-right: 25px; + } + + .brand-text { + margin-right: 45px; + font-size: 1.25rem; + font-weight: 700; + font-family: "TypoGraphica"; + word-break: break-word; + } + + &:hover { + text-decoration: none; + } + } + + // Form container + .form-login { + width: 100%; + padding: 20px 50px; + box-sizing: border-box; + + .errorbox { + padding-bottom: 2rem; + text-align: center; + color: var(--warning); + } + + // Input group styling + .input-group { + position: relative; + margin-bottom: 1.25rem; + + // Icon styling + &::before { + .icon-base(); + position: absolute; + top: 10px; + left: 10px; + z-index: 100; + font-size: 1.5rem; + color: var(--default); + } + + // Animated border + .border { + position: absolute; + bottom: 0; + width: 100%; + height: 1px; + border-bottom: 1px solid var(--primary); + transform: scaleX(0); + transition: transform 0.3s ease; + } + + // Input field + input { + display: block; + width: 100%; + margin: 0.825rem 0; + padding: 0.5rem 0.75rem 0.5rem 3rem; + font-size: 1rem; + line-height: 1.5em; + color: var(--default); + background-color: transparent; + background-clip: padding-box; + border: 0; + border-bottom: 1px solid var(--white); + border-radius: 0; + outline: none; + box-sizing: border-box; + box-shadow: 0 3px 2px rgba(233, 236, 239, 0.05); + transition: all 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55); + + &:focus+.border { + transform: scaleX(1); + } + } + + .cbi-input-password { + position: relative; + margin-bottom: 2rem; + } + + // Icon content + &.user-icon::before { + content: "\e971"; + } + + &.pass-icon::before { + content: "\e910"; + } + } + } + + // Submit button + .cbi-button-apply { + width: 100% !important; + min-height: 50px; + margin: 30px 0 100px; + padding: 10px 0; + font-size: 15px; + font-weight: 600; + color: var(--white); + text-align: center; + letter-spacing: 0.8rem; + background-color: var(--primary) !important; + border: none; + border-radius: 6px; + outline: none; + cursor: pointer; + box-shadow: rgba(0, 0, 0, 0.1) 0 0 50px 0; + transition: all 0.3s ease !important; + + &:hover, + &:focus { + opacity: 0.9; + } + } + } + + // Footer + footer { + position: absolute; + bottom: 0; + z-index: 10; + display: flex; + justify-content: space-evenly; + width: 100%; + margin-top: auto; + padding: 0 0 30px; + color: var(--gray); + text-align: center; + line-height: 1.6rem; + font-size: 0.75rem; + + .ftc { + position: absolute; + bottom: 30px; + width: 100%; + } + + .luci-link { + display: block; + } + } + } +} \ No newline at end of file diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/root/etc/uci-defaults/30_luci-theme-argon b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/root/etc/uci-defaults/30_luci-theme-argon new file mode 100644 index 0000000..6820d25 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/root/etc/uci-defaults/30_luci-theme-argon @@ -0,0 +1,12 @@ +#!/bin/sh + +if [ "$PKG_UPGRADE" != 1 ]; then + uci get luci.themes.Argon >/dev/null 2>&1 || \ + uci batch <<-EOF + set luci.themes.Argon=/luci-static/argon + set luci.main.mediaurlbase=/luci-static/argon + commit luci + EOF +fi + +exit 0 diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/root/usr/libexec/rpcd/luci.argon_wallpaper b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/root/usr/libexec/rpcd/luci.argon_wallpaper new file mode 100644 index 0000000..f046271 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/root/usr/libexec/rpcd/luci.argon_wallpaper @@ -0,0 +1,108 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-3.0-only + +. /usr/share/libubox/jshn.sh + +src="$(uci -q get argon.@global[0].online_wallpaper || echo bing)" +case "$src" in + bing|none|ghser|unsplash|wallhaven) WEB_PIC_SRC="$src" ;; + unsplash_[0-9]*|wallhaven_[0-9]*) WEB_PIC_SRC="$src" ;; + *) WEB_PIC_SRC="bing" ;; +esac + +API_KEY="$(uci -q get argon.@global[0].use_api_key)" +EXACT_RESO="$(uci -q get argon.@global[0].use_exact_resolution || echo '1')" +case "$API_KEY" in *[!A-Za-z0-9_.-]*|????????????????????????????????????????????????????????????????*) API_KEY="" ;; esac +case "$EXACT_RESO" in 1) ;; *) EXACT_RESO=0 ;; esac + +cache_key="$(echo "$WEB_PIC_SRC" | tr -c 'A-Za-z0-9_-' '_')" +CACHE="/var/run/argon_${cache_key}.url" +WRLOCK="/var/lock/argon_${cache_key}.lock" + +valid_url() { + case "$1" in + https://www.bing.com/*|//www.bing.com/*|https://api.vvhan.com/*|https://images.unsplash.com/*|https://wallhaven.cc/*) return 0 ;; + esac + return 1 +} + +fetch_pic_url() { + case "$WEB_PIC_SRC" in + bing) + local picpath="$(wget -T3 -qO- "https://www.bing.com/HPImageArchive.aspx?format=js&n=1" | jsonfilter -qe '@.images[0].url' | sed 's/1920x1080/UHD/g')" + [ -n "$picpath" ] && echo "//www.bing.com${picpath}" + ;; + ghser) + echo "https://api.vvhan.com/api/wallpaper/acg" + ;; + unsplash) + if [ -z "$API_KEY" ]; then + local pic_id="$(wget -T3 --spider "https://source.unsplash.com/1920x1080/daily?wallpapers" 2>&1 | grep -Eo "photo-\w+-\w+" | head -n1)" + [ -n "$pic_id" ] && echo "https://images.unsplash.com/${pic_id}?fm=jpg&fit=crop&w=1920&h=1080" + else + wget -T3 -qO- "https://api.unsplash.com/photos/random?client_id=${API_KEY}" | jsonfilter -qe '@["urls"]["regular"]' + fi + ;; + unsplash_*) + local collection_id="${WEB_PIC_SRC#unsplash_}" + if [ -z "$API_KEY" ]; then + local pic_id="$(wget -T3 --spider "https://source.unsplash.com/collection/${collection_id}/1920x1080" 2>&1 | grep -Eo "photo-\w+-\w+" | head -n1)" + [ -n "$pic_id" ] && echo "https://images.unsplash.com/${pic_id}?fm=jpg&fit=crop&w=1920&h=1080" + else + wget -T3 -qO- "https://api.unsplash.com/photos/random?client_id=${API_KEY}&collections=${collection_id}" | jsonfilter -qe '@["urls"]["regular"]' + fi + ;; + wallhaven) + wget -T3 -qO- "https://wallhaven.cc/api/v1/search?resolutions=1920x1080&sorting=random" | jsonfilter -qe '@.data[0].path' + ;; + wallhaven_*) + local tag_id="${WEB_PIC_SRC#wallhaven_}" + local use_reso="resolutions" + [ "$EXACT_RESO" -eq 1 ] || use_reso="atleast" + [ -z "$API_KEY" ] || API_KEY="apikey=$API_KEY&" + wget -T3 -qO- "https://wallhaven.cc/api/v1/search?${API_KEY}q=id%3A${tag_id}&${use_reso}=1920x1080&sorting=random" | jsonfilter -qe '@.data[0].path' + ;; + esac +} + +try_update() { + exec 200>"$WRLOCK" + if flock -n 200 >/dev/null 2>&1; then + local picurl="$(fetch_pic_url)" + if valid_url "$picurl"; then + printf '%s\n' "$picurl" > "$CACHE" + printf '%s\n' "$picurl" + elif [ -s "$CACHE" ]; then + cat "$CACHE" + else + : > "$CACHE" + fi + flock -u 200 >/dev/null 2>&1 + elif [ -s "$CACHE" ]; then + cat "$CACHE" + fi +} + +case "$1" in +"list") + json_init; json_add_object "get_url"; json_close_object; json_dump; json_cleanup + ;; +"call") + case "$2" in + "get_url") + read -r input + if [ -f "$CACHE" ]; then + idle_t="$(($(date '+%s') - $(date -r "$CACHE" '+%s' 2>/dev/null || echo '0')))" + if [ -s "$CACHE" ] && [ "$idle_t" -le 43200 ]; then + url="$(cat "$CACHE")" + valid_url "$url" || url="" + json_init; json_add_string "url" "$url"; json_dump; json_cleanup; return 0 + elif [ ! -s "$CACHE" ] && [ "$idle_t" -le 120 ]; then + echo '{ "url": "" }'; return 1 + fi + fi + json_init; json_add_string "url" "$(try_update)"; json_dump; json_cleanup; return 0 + ;; + esac + ;; +esac diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/root/usr/share/rpcd/acl.d/luci-theme-argon.json b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/root/usr/share/rpcd/acl.d/luci-theme-argon.json new file mode 100644 index 0000000..5e910df --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/root/usr/share/rpcd/acl.d/luci-theme-argon.json @@ -0,0 +1,8 @@ +{ + "luci-theme-argon": { + "description": "Grant UCI access for luci-theme-argon", + "read": { + "uci": [ "argon" ] + } + } +} diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/ucode/template/themes/argon/footer.ut b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/ucode/template/themes/argon/footer.ut new file mode 100644 index 0000000..07e7bd0 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/ucode/template/themes/argon/footer.ut @@ -0,0 +1,55 @@ +{# + Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material Argon Template + + luci-theme-argon + Copyright 2020 Jerrykuku + + Have a bug? Please create an issue here on GitHub! + https://github.com/jerrykuku/luci-theme-argon/issues + + luci-theme-material: + Copyright 2015 Lutty Yang + + Agron Theme + https://demos.creative-tim.com/argon-dashboard/index.html + + Licensed to the public under the Apache License 2.0 +-#} + + +

+ + + + + + diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/ucode/template/themes/argon/footer_login.ut b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/ucode/template/themes/argon/footer_login.ut new file mode 100644 index 0000000..8b1547a --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/ucode/template/themes/argon/footer_login.ut @@ -0,0 +1,47 @@ +{# + Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material Argon Template + + luci-theme-argon + Copyright 2020 Jerrykuku + + Have a bug? Please create an issue here on GitHub! + https://github.com/jerrykuku/luci-theme-argon/issues + + luci-theme-material: + Copyright 2015 Lutty Yang + + Agron Theme + https://demos.creative-tim.com/argon-dashboard/index.html + + Licensed to the public under the Apache License 2.0 +-#} + + + + + + + + + diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/ucode/template/themes/argon/header.ut b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/ucode/template/themes/argon/header.ut new file mode 100644 index 0000000..92c61ca --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/ucode/template/themes/argon/header.ut @@ -0,0 +1,181 @@ +{# + Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material Argon Template + + luci-theme-argon + Copyright 2020 Jerrykuku + + Have a bug? Please create an issue here on GitHub! + https://github.com/jerrykuku/luci-theme-argon/issues + + luci-theme-material: + Copyright 2015 Lutty Yang + + Argon Theme + https://demos.creative-tim.com/argon-dashboard/index.html + + Licensed to the public under the Apache License 2.0 +-#} + +{% + import { readfile, access } from 'fs'; + import { cursor } from 'uci'; + import { srand } from 'math'; + import { getuid, getspnam } from 'luci.core'; + + const boardinfo = ubus.call("system", "board"); + const hostname = striptags(boardinfo?.hostname ?? '?'); + + let cfg = cursor(); + + //send as HTML5 + http.prepare_content('text/html; charset=UTF-8'); + + srand(+substr(reverse(time() + ""), 0, 8)); + + //Custom settings + let mode = 'normal'; + let bar_color = '#5e72e4'; + let primary, dark_primary, blur_radius, blur_radius_dark, blur_opacity, blur_opacity_dark; + const dark_css = readfile('/www/luci-static/argon/css/dark.css'); + if (access('/etc/config/argon')) { + primary = cfg.get_first('argon', 'global', 'primary'); + dark_primary = cfg.get_first('argon', 'global', 'dark_primary'); + blur_radius = cfg.get_first('argon', 'global', 'blur'); + blur_radius_dark = cfg.get_first('argon', 'global', 'blur_dark'); + blur_opacity = cfg.get_first('argon', 'global', 'transparency'); + blur_opacity_dark = cfg.get_first('argon', 'global', 'transparency_dark'); + mode = cfg.get_first('argon', 'global', 'mode'); + bar_color = (mode == 'dark') ? dark_primary : primary; + } + +-%} + + + + + + + {{ hostname }}{{ node?.title ? ` - ${striptags(node.title)}` : '' }} - LuCI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% if (node?.css): %} + + {% endif -%} + {% if (css): %} + + {% endif -%} + + + + + + + +
+ +
+
+
+
+ +
+
+
+
+
+
+
+ {% if (getuid() == 0 && getspnam('root')?.pwdp === ''): %} +
+

{{ _('No password set!') }}

+

{{ _('There is no password set on this router. Please configure a root password to protect the web interface.') }}

+ {% if (dispatcher.lookup("admin/system/admin")): %} + + {% endif %} +
+ {% endif %} + + + + diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/ucode/template/themes/argon/header_login.ut b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/ucode/template/themes/argon/header_login.ut new file mode 100644 index 0000000..bc40263 --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/ucode/template/themes/argon/header_login.ut @@ -0,0 +1,125 @@ +{# + Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material Argon Template + + luci-theme-argon + Copyright 2020 Jerrykuku + + Have a bug? Please create an issue here on GitHub! + https://github.com/jerrykuku/luci-theme-argon/issues + + luci-theme-material: + Copyright 2015 Lutty Yang + + Argon Theme + https://demos.creative-tim.com/argon-dashboard/index.html + + Licensed to the public under the Apache License 2.0 +-#} + +{% + import { readfile, access } from 'fs'; + import { cursor } from 'uci'; + import { srand } from 'math'; + + const boardinfo = ubus.call("system", "board"); + const hostname = striptags(boardinfo?.hostname ?? '?'); + + let cfg = cursor(); + + //send as HTML5 + http.prepare_content('text/html; charset=UTF-8'); + + srand(+substr(reverse(time() + ""), 0, 8)); + + //Custom settings + let mode = 'normal'; + let bar_color = '#5e72e4'; + let primary, dark_primary, blur_radius, blur_radius_dark, blur_opacity, blur_opacity_dark; + const dark_css = readfile('/www/luci-static/argon/css/dark.css'); + if (access('/etc/config/argon')) { + primary = cfg.get_first('argon', 'global', 'primary'); + dark_primary = cfg.get_first('argon', 'global', 'dark_primary'); + blur_radius = cfg.get_first('argon', 'global', 'blur'); + blur_radius_dark = cfg.get_first('argon', 'global', 'blur_dark'); + blur_opacity = cfg.get_first('argon', 'global', 'transparency'); + blur_opacity_dark = cfg.get_first('argon', 'global', 'transparency_dark'); + mode = cfg.get_first('argon', 'global', 'mode'); + bar_color = (mode == 'dark') ? dark_primary : primary; + } + +-%} + + + + + + + {{ hostname }}{{ node?.title ? ` - ${striptags(node.title)}` : '' }} - LuCI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% if (node?.css): %} + + {% endif -%} + {% if (css): %} + + {% endif -%} + + + + diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/ucode/template/themes/argon/out_header_login.ut b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/ucode/template/themes/argon/out_header_login.ut new file mode 100644 index 0000000..54b599f --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/ucode/template/themes/argon/out_header_login.ut @@ -0,0 +1,12 @@ +{# + Copyright 2008 Steven Barth + Copyright 2008-2019 Jo-Philipp Wich + Licensed to the public under the Apache License 2.0. +-#} + +{% + if (!ctx.template_header_sent) { + include("themes/" + theme + "/header_login"); + ctx.template_header_sent = true; + } +%} diff --git a/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/ucode/template/themes/argon/sysauth.ut b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/ucode/template/themes/argon/sysauth.ut new file mode 100644 index 0000000..8c7f76e --- /dev/null +++ b/immortalwrt-patches/feeds/luci/themes/luci-theme-argon/ucode/template/themes/argon/sysauth.ut @@ -0,0 +1,165 @@ +{# + Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI and Argon Template + + luci-theme-argon + Copyright 2020 Jerryk + + Have a bug? Please create an issue here on GitHub! + https://github.com/jerrykuku/luci-theme-argon/issues + + luci-theme-bootstrap: + Copyright 2008 Steven Barth + Copyright 2008-2016 Jo-Philipp Wich + Copyright 2012 David Menting + + MUI: + https://github.com/muicss/mui + + Argon Theme + https://demos.creative-tim.com/argon-dashboard/index.html + + Licensed to the public under the Apache License 2.0 +-#} + +{% include("themes/" + theme + "/out_header_login") %} +{% + import * as fs from 'fs'; + import { cursor } from 'uci'; + import { rand } from 'math'; + + let cfg = cursor(); + + //Fetch Local Background Media + + const imageTypes = " jpg jpeg png gif webp "; + const videoTypes = " mp4 webm "; + const allTypes = imageTypes + videoTypes; + + function fetchMedia(path, themeDir) { + let backgroundTable = []; + for (f in (fs.lsdir(path))) { + let ext = lc(split(f, '.')?.[1]); + if (ext && index(allTypes, " " + ext + " ") != -1) { + let bg = {}; + bg.type = ext; + bg.url = themeDir + f; + push(backgroundTable, bg); + } + } + return backgroundTable; + } + + function selectBackground(themeDir) { + let bgUrl = media + "/img/bg1.jpg"; + let remoteBgUrl = ""; + let backgroundType = "Image"; + let mimeType = ""; + + if (fs.access("/etc/config/argon")) { + let online_wallpaper = cfg.get_first('argon', 'global', 'online_wallpaper') ?? (cfg.get_first('argon', 'global', 'bing_background') == '1' ? 'bing' : null); + if (online_wallpaper && online_wallpaper != "none") { + const picurl = ubus.call("luci.argon_wallpaper", "get_url") ?? {}; + if (picurl?.url && match(picurl.url, /^(https?:\/\/|\/\/)www\.bing\.com\/|^(https?:\/\/)api\.vvhan\.com\/|^(https?:\/\/)images\.unsplash\.com\/|^(https?:\/\/)wallhaven\.cc\//)) + remoteBgUrl = picurl.url; + } + } + + let background = fetchMedia("/www" + themeDir, themeDir); + // Priority: local uploaded backgrounds win; only fall through to + // the remote Bing/preload URL when no local files exist. + if (length(background) > 0) { + let currentBg = background[(rand() % length(background))]; + bgUrl = currentBg.url; + if (index(videoTypes, " " + currentBg.type + " ") != -1) { + backgroundType = "Video"; + mimeType = "video/" + currentBg.type; + } + } + + return {bgUrl, remoteBgUrl, backgroundType, mimeType}; + } + + const boardinfo = ubus.call("system", "board"); + const hostname = striptags(boardinfo?.hostname ?? '?'); + const themeDir = media + "/background/"; + const bgArry = selectBackground(themeDir); + +%} + +