diff --git a/.github/update.log b/.github/update.log index e5329e6047..7314121e95 100644 --- a/.github/update.log +++ b/.github/update.log @@ -1177,3 +1177,4 @@ Update On Thu Nov 6 19:42:10 CET 2025 Update On Fri Nov 7 19:41:20 CET 2025 Update On Sat Nov 8 19:37:24 CET 2025 Update On Sun Nov 9 19:36:09 CET 2025 +Update On Mon Nov 10 19:41:15 CET 2025 diff --git a/clash-meta/dns/middleware.go b/clash-meta/dns/middleware.go index 8472eb94e2..4e026cd9ea 100644 --- a/clash-meta/dns/middleware.go +++ b/clash-meta/dns/middleware.go @@ -64,7 +64,7 @@ func withHosts(mapping *lru.LruCache[netip.Addr, string]) middleware { if mapping != nil { mapping.SetWithExpire(ipAddr, host, time.Now().Add(time.Second*10)) } - } else if q.Qtype == D.TypeAAAA { + } else if ipAddr.Is6() && q.Qtype == D.TypeAAAA { rr := &D.AAAA{} rr.Hdr = D.RR_Header{Name: q.Name, Rrtype: D.TypeAAAA, Class: D.ClassINET, Ttl: 10} rr.AAAA = ipAddr.AsSlice() diff --git a/clash-nyanpasu/backend/tauri/tauri.conf.json b/clash-nyanpasu/backend/tauri/tauri.conf.json index f220ca4271..f4139268d0 100644 --- a/clash-nyanpasu/backend/tauri/tauri.conf.json +++ b/clash-nyanpasu/backend/tauri/tauri.conf.json @@ -40,7 +40,7 @@ "sidecar/clash-rs-alpha", "sidecar/nyanpasu-service" ], - "copyright": "© 2024 Clash Nyanpasu All Rights Reserved", + "copyright": "© 2025 Clash Nyanpasu All Rights Reserved", "category": "DeveloperTool", "shortDescription": "Clash Nyanpasu! (∠・ω< )⌒☆", "longDescription": "Clash Nyanpasu! (∠・ω< )⌒☆", diff --git a/clash-nyanpasu/manifest/version.json b/clash-nyanpasu/manifest/version.json index 4f234af4eb..27fa0f398c 100644 --- a/clash-nyanpasu/manifest/version.json +++ b/clash-nyanpasu/manifest/version.json @@ -1,11 +1,11 @@ { "manifest_version": 1, "latest": { - "mihomo": "v1.19.15", - "mihomo_alpha": "alpha-ff76576", + "mihomo": "v1.19.16", + "mihomo_alpha": "alpha-054e63c", "clash_rs": "v0.9.2", "clash_premium": "2023-09-05-gdcc8d87", - "clash_rs_alpha": "0.9.2-alpha+sha.0df6c92" + "clash_rs_alpha": "0.9.2-alpha+sha.87c7b2c" }, "arch_template": { "mihomo": { @@ -69,5 +69,5 @@ "linux-armv7hf": "clash-armv7-unknown-linux-gnueabihf" } }, - "updated_at": "2025-11-07T22:21:06.002Z" + "updated_at": "2025-11-09T22:21:09.350Z" } diff --git a/lede/target/linux/mediatek/patches-6.12/830-thermal-drivers-mediatek-lvts_thermal-Add-irq_enable-support.patch b/lede/target/linux/mediatek/patches-6.12/830-thermal-drivers-mediatek-lvts_thermal-Add-irq_enable-support.patch new file mode 100644 index 0000000000..ff1fd3e016 --- /dev/null +++ b/lede/target/linux/mediatek/patches-6.12/830-thermal-drivers-mediatek-lvts_thermal-Add-irq_enable-support.patch @@ -0,0 +1,148 @@ +From: Chad Monroe +Date: Mon, 01 Sep 2025 06:42:10 -0700 +Subject: [PATCH] thermal/drivers/mediatek/lvts_thermal: Add irq_enable + support. + +Allow interrupt support to be disabled as some SoCs don't support it. + +Signed-off-by: Chad Monroe +--- + drivers/thermal/mediatek/lvts_thermal.c | 33 ++++++++++++++++------ + 1 file changed, 25 insertions(+), 8 deletions(-) + +--- a/drivers/thermal/mediatek/lvts_thermal.c ++++ b/drivers/thermal/mediatek/lvts_thermal.c +@@ -127,6 +127,7 @@ struct lvts_data { + const struct lvts_ctrl_data *lvts_ctrl; + const u32 *conn_cmd; + const u32 *init_cmd; ++ bool irq_enable; + int num_lvts_ctrl; + int num_conn_cmd; + int num_init_cmd; +@@ -408,6 +409,10 @@ static int lvts_set_trips(struct thermal + lvts_ctrl->high_thresh = high; + lvts_ctrl->low_thresh = low; + } ++ ++ if (!lvts_data->irq_enable) ++ return 0; ++ + lvts_update_irq_mask(lvts_ctrl); + + if (!should_update_thresh) +@@ -921,6 +926,8 @@ static void lvts_write_config(struct lvt + + static int lvts_irq_init(struct lvts_ctrl *lvts_ctrl) + { ++ const struct lvts_data *lvts_data = lvts_ctrl->lvts_data; ++ + /* + * LVTS_PROTCTL : Thermal Protection Sensor Selection + * +@@ -954,7 +961,8 @@ static int lvts_irq_init(struct lvts_ctr + * The LVTS_MONINT register layout is the same as the LVTS_MONINTSTS + * register, except we set the bits to enable the interrupt. + */ +- writel(0, LVTS_MONINT(lvts_ctrl->base)); ++ if (lvts_data->irq_enable) ++ writel(0, LVTS_MONINT(lvts_ctrl->base)); + + return 0; + } +@@ -1338,9 +1346,11 @@ static int lvts_probe(struct platform_de + if (IS_ERR(lvts_td->reset)) + return dev_err_probe(dev, PTR_ERR(lvts_td->reset), "Failed to get reset control\n"); + +- irq = platform_get_irq(pdev, 0); +- if (irq < 0) +- return irq; ++ if (lvts_data->irq_enable) { ++ irq = platform_get_irq(pdev, 0); ++ if (irq < 0) ++ return irq; ++ } + + golden_temp_offset = lvts_data->temp_offset; + +@@ -1352,10 +1362,12 @@ static int lvts_probe(struct platform_de + * At this point the LVTS is initialized and enabled. We can + * safely enable the interrupt. + */ +- ret = devm_request_threaded_irq(dev, irq, NULL, lvts_irq_handler, +- IRQF_ONESHOT, dev_name(dev), lvts_td); +- if (ret) +- return dev_err_probe(dev, ret, "Failed to request interrupt\n"); ++ if (lvts_data->irq_enable) { ++ ret = devm_request_threaded_irq(dev, irq, NULL, lvts_irq_handler, ++ IRQF_ONESHOT, dev_name(dev), lvts_td); ++ if (ret) ++ return dev_err_probe(dev, ret, "Failed to request interrupt\n"); ++ } + + platform_set_drvdata(pdev, lvts_td); + +@@ -1754,6 +1766,7 @@ static const struct lvts_ctrl_data mt819 + }; + + static const struct lvts_data mt7988_lvts_ap_data = { ++ .irq_enable = true, + .lvts_ctrl = mt7988_lvts_ap_data_ctrl, + .conn_cmd = mt7988_conn_cmds, + .init_cmd = mt7988_init_cmds, +@@ -1766,6 +1779,7 @@ static const struct lvts_data mt7988_lvt + }; + + static const struct lvts_data mt8186_lvts_data = { ++ .irq_enable = true, + .lvts_ctrl = mt8186_lvts_data_ctrl, + .conn_cmd = default_conn_cmds, + .init_cmd = default_init_cmds, +@@ -1779,6 +1793,7 @@ static const struct lvts_data mt8186_lvt + }; + + static const struct lvts_data mt8188_lvts_mcu_data = { ++ .irq_enable = true, + .lvts_ctrl = mt8188_lvts_mcu_data_ctrl, + .conn_cmd = default_conn_cmds, + .init_cmd = default_init_cmds, +@@ -1792,6 +1807,7 @@ static const struct lvts_data mt8188_lvt + }; + + static const struct lvts_data mt8188_lvts_ap_data = { ++ .irq_enable = true, + .lvts_ctrl = mt8188_lvts_ap_data_ctrl, + .conn_cmd = default_conn_cmds, + .init_cmd = default_init_cmds, +@@ -1805,6 +1821,7 @@ static const struct lvts_data mt8188_lvt + }; + + static const struct lvts_data mt8192_lvts_mcu_data = { ++ .irq_enable = true, + .lvts_ctrl = mt8192_lvts_mcu_data_ctrl, + .conn_cmd = default_conn_cmds, + .init_cmd = default_init_cmds, +@@ -1818,6 +1835,7 @@ static const struct lvts_data mt8192_lvt + }; + + static const struct lvts_data mt8192_lvts_ap_data = { ++ .irq_enable = true, + .lvts_ctrl = mt8192_lvts_ap_data_ctrl, + .conn_cmd = default_conn_cmds, + .init_cmd = default_init_cmds, +@@ -1831,6 +1849,7 @@ static const struct lvts_data mt8192_lvt + }; + + static const struct lvts_data mt8195_lvts_mcu_data = { ++ .irq_enable = true, + .lvts_ctrl = mt8195_lvts_mcu_data_ctrl, + .conn_cmd = default_conn_cmds, + .init_cmd = default_init_cmds, +@@ -1844,6 +1863,7 @@ static const struct lvts_data mt8195_lvt + }; + + static const struct lvts_data mt8195_lvts_ap_data = { ++ .irq_enable = true, + .lvts_ctrl = mt8195_lvts_ap_data_ctrl, + .conn_cmd = default_conn_cmds, + .init_cmd = default_init_cmds, diff --git a/lede/target/linux/mediatek/patches-6.12/831-thermal-drivers-mediatek-lvts_thermal-Add-MT7987-support.patch b/lede/target/linux/mediatek/patches-6.12/831-thermal-drivers-mediatek-lvts_thermal-Add-MT7987-support.patch new file mode 100644 index 0000000000..7cd4affae6 --- /dev/null +++ b/lede/target/linux/mediatek/patches-6.12/831-thermal-drivers-mediatek-lvts_thermal-Add-MT7987-support.patch @@ -0,0 +1,106 @@ +From: Chad Monroe +Date: Mon, 01 Sep 2025 06:44:04 -0700 +Subject: [PATCH] thermal/drivers/mediatek/lvts_thermal: Add MT7987 support + +Add support for Mediatek MT7987 LVTS. Based patch[1] from vendor SDK. + +1: https://git01.mediatek.com/plugins/gitiles/openwrt/feeds/mtk-openwrt-feeds/+/742007e189ffcc95783924cea1150f574b6eb71e + +Signed-off-by: Chad Monroe +--- + drivers/thermal/mediatek/lvts_thermal.c | 36 ++++++++++ + include/dt-bindings/thermal/mediatek,lvts-thermal.h | 3 + 2 files changed, 39 insertions(+) + +--- a/drivers/thermal/mediatek/lvts_thermal.c ++++ b/drivers/thermal/mediatek/lvts_thermal.c +@@ -87,6 +87,8 @@ + #define LVTS_COEFF_B_MT8195 250460 + #define LVTS_COEFF_A_MT7988 -204650 + #define LVTS_COEFF_B_MT7988 204650 ++#define LVTS_COEFF_A_MT7987 -204650 ++#define LVTS_COEFF_B_MT7987 204650 + + #define LVTS_MSR_IMMEDIATE_MODE 0 + #define LVTS_MSR_FILTERED_MODE 1 +@@ -1385,6 +1387,19 @@ static void lvts_remove(struct platform_ + lvts_ctrl_set_enable(&lvts_td->lvts_ctrl[i], false); + } + ++static const struct lvts_ctrl_data mt7987_lvts_ap_data_ctrl[] = { ++ { ++ .lvts_sensor = { ++ { .dt_id = MT7987_CPU, ++ .cal_offsets = { 0x04, 0x05, 0x06 } }, ++ { .dt_id = MT7987_ETH2P5G, ++ .cal_offsets = { 0x08, 0x09, 0x0a } }, ++ }, ++ VALID_SENSOR_MAP(1, 1, 0, 0), ++ .offset = 0x0, ++ }, ++}; ++ + static const struct lvts_ctrl_data mt7988_lvts_ap_data_ctrl[] = { + { + .lvts_sensor = { +@@ -1455,6 +1470,7 @@ static int lvts_resume(struct device *de + } + + static const u32 default_conn_cmds[] = { 0xC103FFFF, 0xC502FF55 }; ++static const u32 mt7987_conn_cmds[] = { 0xC103FFFF, 0xC502FC55 }; + static const u32 mt7988_conn_cmds[] = { 0xC103FFFF, 0xC502FC55 }; + + /* +@@ -1467,6 +1483,12 @@ static const u32 default_init_cmds[] = { + 0xC10300FC, 0xC103009D, 0xC10300F1, 0xC10300E1 + }; + ++static const u32 mt7987_init_cmds[] = { ++ 0xC1030300, 0xC1030420, 0xC1030500, 0xC10307A6, 0xC10308C7, ++ 0xC103098D, 0xC1030C7C, 0xC1030AA8, 0xC10308CE, 0xC10308C7, ++ 0xC1030B04, 0xC1030E01, 0xC10306B8 ++}; ++ + static const u32 mt7988_init_cmds[] = { + 0xC1030300, 0xC1030420, 0xC1030500, 0xC10307A6, 0xC1030CFC, + 0xC1030A8C, 0xC103098D, 0xC10308F1, 0xC1030B04, 0xC1030E01, +@@ -1765,6 +1787,19 @@ static const struct lvts_ctrl_data mt819 + } + }; + ++static const struct lvts_data mt7987_lvts_ap_data = { ++ .irq_enable = false, ++ .lvts_ctrl = mt7987_lvts_ap_data_ctrl, ++ .conn_cmd = mt7987_conn_cmds, ++ .init_cmd = mt7987_init_cmds, ++ .num_lvts_ctrl = ARRAY_SIZE(mt7987_lvts_ap_data_ctrl), ++ .num_conn_cmd = ARRAY_SIZE(mt7987_conn_cmds), ++ .num_init_cmd = ARRAY_SIZE(mt7987_init_cmds), ++ .temp_factor = LVTS_COEFF_A_MT7987, ++ .temp_offset = LVTS_COEFF_B_MT7987, ++ .gt_calib_bit_offset = 24, ++}; ++ + static const struct lvts_data mt7988_lvts_ap_data = { + .irq_enable = true, + .lvts_ctrl = mt7988_lvts_ap_data_ctrl, +@@ -1877,6 +1912,7 @@ static const struct lvts_data mt8195_lvt + }; + + static const struct of_device_id lvts_of_match[] = { ++ { .compatible = "mediatek,mt7987-lvts-ap", .data = &mt7987_lvts_ap_data }, + { .compatible = "mediatek,mt7988-lvts-ap", .data = &mt7988_lvts_ap_data }, + { .compatible = "mediatek,mt8186-lvts", .data = &mt8186_lvts_data }, + { .compatible = "mediatek,mt8188-lvts-mcu", .data = &mt8188_lvts_mcu_data }, +--- a/include/dt-bindings/thermal/mediatek,lvts-thermal.h ++++ b/include/dt-bindings/thermal/mediatek,lvts-thermal.h +@@ -7,6 +7,9 @@ + #ifndef __MEDIATEK_LVTS_DT_H + #define __MEDIATEK_LVTS_DT_H + ++#define MT7987_CPU 0 ++#define MT7987_ETH2P5G 1 ++ + #define MT7988_CPU_0 0 + #define MT7988_CPU_1 1 + #define MT7988_ETH2P5G_0 2 diff --git a/mieru/README.md b/mieru/README.md index d907de199d..0b949bfc4d 100644 --- a/mieru/README.md +++ b/mieru/README.md @@ -20,7 +20,11 @@ The mieru proxy software suite consists of two parts, a client software called m 1. Supports multiple users sharing a single proxy server. 1. Supports both IPv4 and IPv6. -## Third Party Clients +## Third Party Server Software + +- [mihomo](https://github.com/MetaCubeX/mihomo) + +## Third Party Client Software - Desktop (Windows, MacOS, Linux) - [Clash Verge Rev](https://www.clashverge.dev/) diff --git a/mieru/README.zh_CN.md b/mieru/README.zh_CN.md index 48b3f4da3f..a4956e8518 100644 --- a/mieru/README.zh_CN.md +++ b/mieru/README.zh_CN.md @@ -18,7 +18,11 @@ mieru 代理软件由称为 mieru【見える】的客户端软件和称为 mita 1. 支持多个用户共享代理服务器。 1. 支持 IPv4 和 IPv6。 -## 第三方客户端 +## 第三方服务器软件 + +- [mihomo](https://github.com/MetaCubeX/mihomo) + +## 第三方客户端软件 - 桌面 (Windows, MacOS, Linux) - [Clash Verge Rev](https://www.clashverge.dev/) diff --git a/mihomo/dns/middleware.go b/mihomo/dns/middleware.go index 8472eb94e2..4e026cd9ea 100644 --- a/mihomo/dns/middleware.go +++ b/mihomo/dns/middleware.go @@ -64,7 +64,7 @@ func withHosts(mapping *lru.LruCache[netip.Addr, string]) middleware { if mapping != nil { mapping.SetWithExpire(ipAddr, host, time.Now().Add(time.Second*10)) } - } else if q.Qtype == D.TypeAAAA { + } else if ipAddr.Is6() && q.Qtype == D.TypeAAAA { rr := &D.AAAA{} rr.Hdr = D.RR_Header{Name: q.Name, Rrtype: D.TypeAAAA, Class: D.ClassINET, Ttl: 10} rr.AAAA = ipAddr.AsSlice() diff --git a/openwrt-packages/luci-theme-argon/htdocs/luci-static/argon/css/cascade.css b/openwrt-packages/luci-theme-argon/htdocs/luci-static/argon/css/cascade.css index 10917465c9..29b9d32ef2 100644 --- a/openwrt-packages/luci-theme-argon/htdocs/luci-static/argon/css/cascade.css +++ b/openwrt-packages/luci-theme-argon/htdocs/luci-static/argon/css/cascade.css @@ -1377,16 +1377,6 @@ footer > a { 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; } -.modal.alert-message { - position: static; - width: 90%; - min-width: 270px; - max-width: 600px; - left: auto; - top: auto; - transform: none; - margin: 5em auto; -} .alert.error, .alert-message.error { background-color: var(--warning); @@ -1400,6 +1390,16 @@ footer > a { .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; @@ -1417,10 +1417,9 @@ footer > a { margin-top: 0rem; position: relative; top: 0; - transform:translate(-50%, 0); + transform: translate(-50%, 0); width: 100%; } - .lg { margin: 0; padding: 0 !important; @@ -2094,10 +2093,10 @@ td > table > tbody > tr > td, max-width: 3rem; } .cbi-input-file { - appearance: none; + appearance: auto !important; } .cbi-input-file::-webkit-file-upload-button { - display: none; + display: inline-block !important; } .cbi-input-invalid { color: #f5365c !important; @@ -3464,7 +3463,9 @@ pre.command-output { background: #fb6340 !important; border-color: #fb6340 !important; margin-left: 0 !important; - width: 82px !important; +} +[data-page="admin-system-reboot"] .cbi-button.cbi-button-action.important { + align-self: flex-end; } /* applyreboot fix */ #applyreboot-container { @@ -3479,7 +3480,7 @@ pre.command-output { padding-left: 1.5rem; } [data-page="admin-system-poweroffdevice"] .container h2 { - margin: 0 0 1rem 0; + margin: 0; } [data-page="admin-system-poweroffdevice"] .container h2 + p { margin-bottom: 1rem; @@ -3488,6 +3489,9 @@ pre.command-output { [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; } @@ -3582,6 +3586,31 @@ pre.command-output { [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; @@ -3723,7 +3752,6 @@ pre.command-output { } [data-page^="admin-services-openclash"] .cbi-input-file { padding: 0.2813rem; - box-sizing: content-box; width: 15rem !important; } [data-page^="admin-services-openclash"] [id="container.openclash.config.debug"] fieldset { @@ -3858,6 +3886,16 @@ div[style*="display:grid;grid-template-columns:repeat"] .ifacebox .ifacebox-body [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 { diff --git a/openwrt-packages/luci-theme-argon/htdocs/luci-static/argon/css/dark.css b/openwrt-packages/luci-theme-argon/htdocs/luci-static/argon/css/dark.css index 4474718ada..fc36987638 100644 --- a/openwrt-packages/luci-theme-argon/htdocs/luci-static/argon/css/dark.css +++ b/openwrt-packages/luci-theme-argon/htdocs/luci-static/argon/css/dark.css @@ -1 +1 @@ -body{background:#1e1e1e;color:#cccccc}.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) saturate(140%);background-color:rgba(0, 0, 0, 0.5)}.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>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}.tr[data-title]::before,.tr.cbi-section-table-titles.named::before {background-color: #252526;}.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-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} +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/openwrt-packages/luci-theme-argon/less/cascade.less b/openwrt-packages/luci-theme-argon/less/cascade.less index 94fbe4978b..50296f91eb 100644 --- a/openwrt-packages/luci-theme-argon/less/cascade.less +++ b/openwrt-packages/luci-theme-argon/less/cascade.less @@ -1087,11 +1087,10 @@ td>table>tbody>tr>td, } .cbi-input-file { - appearance: none; + appearance: auto !important; - // 去掉选择文件按钮 &::-webkit-file-upload-button { - display: none; + display: inline-block !important; } } diff --git a/openwrt-packages/luci-theme-argon/less/dark.less b/openwrt-packages/luci-theme-argon/less/dark.less index 3fbd204639..4a67e6f902 100644 --- a/openwrt-packages/luci-theme-argon/less/dark.less +++ b/openwrt-packages/luci-theme-argon/less/dark.less @@ -34,6 +34,10 @@ body { color: #cccccc; } +.spinning::before { + filter: invert(1); +} + .login-page .login-container { .login-form { @@ -601,6 +605,11 @@ td.cbi-value-field var { 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, diff --git a/openwrt-packages/luci-theme-argon/less/page-fix.less b/openwrt-packages/luci-theme-argon/less/page-fix.less index 623f0468d4..34e980008c 100644 --- a/openwrt-packages/luci-theme-argon/less/page-fix.less +++ b/openwrt-packages/luci-theme-argon/less/page-fix.less @@ -362,7 +362,10 @@ background: #fb6340 !important; border-color: #fb6340 !important; margin-left: 0 !important; - width: 82px !important; + } + + .cbi-button.cbi-button-action.important { + align-self: flex-end; } } @@ -388,7 +391,7 @@ [data-page="admin-system-poweroffdevice"] { .container { h2 { - margin: 0 0 1rem 0; + margin: 0; } h2+p { @@ -400,6 +403,11 @@ display: none; } } + + + .btn.cbi-button.cbi-button-negative { + align-self: flex-end; + } } // 2. Network Configuration Pages @@ -539,10 +547,42 @@ // 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 { + #view > div:first-child { gap: 0 !important; } } @@ -757,7 +797,6 @@ .cbi-input-file { padding: 0.2813rem; - box-sizing: content-box; width: 15rem !important; } @@ -950,3 +989,16 @@ div[style*="display:grid;grid-template-columns:repeat"] { [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/openwrt-packages/luci-theme-argon/root/usr/libexec/rpcd/luci.argon_wallpaper b/openwrt-packages/luci-theme-argon/root/usr/libexec/rpcd/luci.argon_wallpaper index 530121f5e8..346b1dcfab 100755 --- a/openwrt-packages/luci-theme-argon/root/usr/libexec/rpcd/luci.argon_wallpaper +++ b/openwrt-packages/luci-theme-argon/root/usr/libexec/rpcd/luci.argon_wallpaper @@ -74,6 +74,16 @@ try_update() { if flock -n 200 >"/dev/null" 2>&1; then local picurl="$(fetch_pic_url)" if [ -n "$picurl" ]; then + + # below is quirk fix for all browsers + # for some weird reason on first load, wallhaven images needs to be + # download or browsed first before it can be shown as a background image + # if not, browser only displays a blank image + # NOTE: only happens to Wallhaven.cc source images + if [[ "$WEB_PIC_SRC" == wallhave* ]] ; then + wget -T3 -qO- "${picurl}" > /dev/null + fi + echo "$picurl" | tee "$CACHE" else if [ -s "$CACHE" ]; then diff --git a/openwrt-packages/luci-theme-kucat/Makefile b/openwrt-packages/luci-theme-kucat/Makefile index e7e6f0f5e1..7071e51f48 100644 --- a/openwrt-packages/luci-theme-kucat/Makefile +++ b/openwrt-packages/luci-theme-kucat/Makefile @@ -9,13 +9,13 @@ THEME_NAME:=kucat THEME_TITLE:=Kucat Theme PKG_NAME:=luci-theme-$(THEME_NAME) LUCI_TITLE:=Kucat Theme by sirpdboy -LUCI_DEPENDS:= -PKG_VERSION:=2.7.4 -PKG_RELEASE:=20251107 +LUCI_DEPENDS:=+wget +jsonfilter +PKG_VERSION:=3.0.2 +PKG_RELEASE:=20251111 define Package/luci-theme-$(THEME_NAME)/conffiles /www/luci-static/resources/background/ -/www/luci-static/kucat/img/ +/www/luci-static/kucat/background/ endef include $(TOPDIR)/feeds/luci/luci.mk diff --git a/openwrt-packages/luci-theme-kucat/htdocs/luci-static/kucat/background/README.md b/openwrt-packages/luci-theme-kucat/htdocs/luci-static/kucat/background/README.md new file mode 100644 index 0000000000..a86f27b06a --- /dev/null +++ b/openwrt-packages/luci-theme-kucat/htdocs/luci-static/kucat/background/README.md @@ -0,0 +1,2 @@ +Drop background here! +accept jpg png gif mp4 webm diff --git a/openwrt-packages/luci-theme-kucat/htdocs/luci-static/kucat/css/dark.css b/openwrt-packages/luci-theme-kucat/htdocs/luci-static/kucat/css/dark.css new file mode 100644 index 0000000000..99cbecbad4 --- /dev/null +++ b/openwrt-packages/luci-theme-kucat/htdocs/luci-static/kucat/css/dark.css @@ -0,0 +1 @@ +body{font-family:"Microsoft Yahei","Google Sans","WenQuanYi Micro Hei","sans-serif","Helvetica Neue","Helvetica","Hiragino Sans GB"!important}body{color:#98a6ad}*::-webkit-scrollbar{background:transparent}*::-webkit-scrollbar-thumb{background:#666;height:10px;border-radius:5px}*::-webkit-scrollbar-thumb:hover{background-color:#bbb}*::-webkit-scrollbar-track{background:transparent}::selection{background-color:#374564!important;color:#ccc}a:link,a:visited,a:active{color:#d0d7de}a{color:#d0d7de}header.bar-primary .container-bar-right,header.bar-primary .container-bar-left{background-color:rgba(var(--primary-rgbm),1);box-shadow:0 0.5rem 1rem rgba(255,255,255,0.15);transition:all .2s ease;transition:0.3s ease-in-out}header.bar-primary .container-bar-right .labelbar:hover::before,header.bar-primary .container-bar-left .labelbar:hover::before{color:#d0d7de}header.bar-primary .container-bar-left .pdboy-closebar:before{color:#d0d7de}header.bar-primary .container-bar-right .pdboy-openbar:before{color:#d0d7de}header.bar-primary .container-bar-left .pdboy-gohome:before{color:#d0d7de}header.bar-primary .container-bar-left .pdboy-gossr:before{color:#d0d7de}header.bar-primary .container-bar-left .pdboy-gonet:before{color:#d0d7de}header.bar-primary .container-bar-left .pdboy-gouser:before{color:#d0d7de}header.bar-primary .container-bar-left .pdboy-gocontrol:before{color:#d0d7de}header.bar-primary .container-bar-left .pdboy-goadvanced:before{color:#d0d7de}#detail-bubble>div{border:1px solid rgba(255,255,255,0.3);border-radius:3px;padding:1px;background-color:rgba(var(--primary-rgbbody),1)!important}#detail-bubble .head .dismiss{color:#8391a2}#bubble-arrow{border:1px solid rgba(255,255,255,0.3);background-color:rgba(var(--primary-rgbbody),1)}header.bg-primary{box-shadow:0 0.5rem 1rem rgba(255,255,255,0.35)}.uci_change_indicator.label.notice,.pd-primary .fill .container .flex1 .showSide,.pd-primary .fill .container .flex1 .brand,.showWord::after,.showWord::before,header>.fill>.container>.showWord,.showWord{color:#e9eff3}header>.fill>.container>.brand{font-family:"Microsoft Yahei","Google Sans","WenQuanYi Micro Hei","sans-serif","Helvetica Neue","Helvetica","Hiragino Sans GB";color:#e9eff3}.pull-right a,.pull-right span a{color:#bbb}.pull-right a:hover,.pull-right span a:hover{background-color:rgba(255,255,255,0.2);color:#f8f8f8}.pdboy-status_on::before{color:#e9eff3}.showSide{color:#e9eff3}.notice{color:#bbb}.label{color:#bbb}footer{color:#bbb}footer a{color:#bbb}.main .main-left{-webkit-box-shadow:rgb(250 250 250 / 75%) 0 0 15px -5px;box-shadow:2px 2px 8px #666,-2px -2px 8px #bbb}.main .main-left::-webkit-scrollbar-thumb{height:8px;background:#555;border-radius:5px}.main .main-left::-webkit-scrollbar-thumb:hover,.main .main-left::-webkit-scrollbar-thumb:active{background:#bbb;border:none}.main .main-left .nav li.slide .menu{color:#bbb}.main .main-left .nav .slide .menu:after,.main .main-left .nav li.slide .menu::after{color:#bbb}.main .main-left .nav li.slide .menu:hover a::after,.main .main-left .nav li.slide .menu.active a::after{color:#bbb}.main>.main-left>.nav>.slide>.menu.active::before,.main .main-left .nav li.slide .menu:hover::after,.main .main-left .nav li.slide .menu.active::after{color:#e9eff3}.main .main-left .nav>li>a:hover,.main .main-left .nav>li>a.active,.main .main-left .nav li.slide .menu:hover,.main .main-left .nav li.slide .menu.active{background-color:rgba(255,255,255,0.2);color:#e9eff3 !important}.main .main-left .nav li.slide .menu:hover a,.main .main-left .nav li.slide .menu.active a{color:#e9eff3}.main .main-left .nav li.slide .menu:hover::before,.main .main-left .nav li.slide .menu.active::before{color:#e9eff3}.main .main-left .nav li.slide .slide-menu li a{color:#bbb}.main .main-left .nav .slide .slide-menu .active a{color:#e9eff3}.main .main-left .nav .slide .slide-menu > li.active{color:#e9eff3;background-color:rgba(255,255,255,0.2);border-left:4px solid #fd8c73}.main .main-left .nav .slide .slide-menu li:hover{background-color:rgba(255,255,255,0.2)}.main .main-left .nav .slide .slide-menu li:active a{color:#e9eff3}.main .main-left .nav .slide .slide-menu li:hover a{color:#e9eff3}.main .main-left .sidenav-header .brand{font-family:"Microsoft Yahei",-apple-system,"WenQuanYi Micro Hei","sans-serif";color:#ccc}.main .main-right #maincontent .container>div:nth-child(1).alert-message.warning>a{color:#ccc}.main .main-left .nav>li>a:first-child,.main .main-left .nav li.slide .menu::before,.main .main-left .nav>li>a:first-child::before,.main .main-left .nav .slide .menu::before{color:#bbb}select,input{font-family:"Microsoft Yahei","WenQuanYi Micro Hei","sans-serif","Helvetica Neue","Helvetica","Hiragino Sans GB"}input[type="checkbox"]{background:rgba(255,255,255,0.1)}input:checked[type="checkbox"]:before{transform:rotate(45deg);width:12px;margin-left:5px;border-color:#f5f5f5;border-width:3px;border-top-color:transparent;border-left-color:transparent;border-radius:0}.cbi-input-radio:checked{background-image:url('data:image/svg+xml,%3csvg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'-4 -4 8 8\'%3e%3ccircle r=\'3\' fill=\'%23fff\'/%3e%3c/svg%3e') !important;background-color:rgba(255,255,255,0.7) !important;background-size:70%;background-repeat:no-repeat;background-position:center}select:not([multiple="multiple"]):focus,input:not(.cbi-button):focus,.cbi-dropdown:focus{background-color:rgba(255,255,255,0.18);box-shadow:0 0.5rem 1rem rgba(255,255,255,0.35);-webkit-box-shadow:0 0 6px rgba(255,255,255,0.35);-moz-box-shadow:0 0 6px rgba(255,255,255,0.35)}.btn,button,select,input,.cbi-dropdown,.item::after{color:#d0d7de;border:1px solid rgba(255,255,255,0.12)!important;box-shadow:0 0.5rem 1rem rgba(255,255,255,0.12)!important}.btn,.cbi-button,.item::after{color:#eee}.cbi-input-textarea,textarea{color:#8391a2;background-color:rgba(255,255,255,0.1);border:1px solid rgba(255,255,255,0.12)!important;box-shadow:0 0.5rem 1rem rgba(255,255,255,0.12)!important}#diag-rc-output>pre{color:#bbb}#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-main-login .main .main-right #maincontent .alert-message p{color:#eee;font-weight:normal}.node-main-login .errorbox{color:#eee !important}.table{color:#8391a2}.table-titles .th{color:#8391a2}button:hover,.btn:hover,.cbi-button:hover,.item:hover::after{box-shadow:0 0.5rem 1rem rgba(255,255,255,0.35);-webkit-box-shadow:0 0 6px rgba(255,255,255,0.35);-moz-box-shadow:0 0 6px rgba(255,255,255,0.35)}.btn:active,.cbi-button:active,button:active,.item:hover::after{box-shadow:0 0.5rem 1rem rgba(255,255,255,0.15);-webkit-box-shadow:0 0 6px rgba(255,255,255,0.15);-moz-box-shadow:0 0 6px rgba(255,255,255,0.15)}fieldset[id^="cbi-apply-"]{box-shadow:0 2px 2px 0 rgba(255,255,255,0.14),0 3px 1px -2px rgba(255,255,255,0.32),0 1px 5px 0 rgba(255,255,255,0.2)}.cbi-section>h3:first-child,.panel-title{color:#bbb}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{color:#8391a2}.cbi-tabcontainer>.cbi-value:nth-of-type(4n+2):hover,.cbi-map>.cbi-section .cbi-value:nth-of-type(4n+2):hover,fieldset>table>tbody>tr:nth-of-type(4n+2):hover,table>tbody>tr:nth-of-type(4n+2):hover,div>.table>.tr:nth-of-type(4n+2):hover{background-color:rgba(250,250,250,0.05)}.cbi-tabcontainer>.cbi-value:nth-of-type(2n+1):hover,.cbi-map>.cbi-section .cbi-value:nth-of-type(2n+1):hover,fieldset>table>tbody>tr:nth-of-type(2n+1):hover,table>tbody>tr:nth-of-type(2n+1):hover,div>.table>.tr:nth-of-type(2n+1):hover{background-color:rgba(250,250,250,0.05)}.cbi-tabcontainer>.cbi-value:nth-of-type(4n):hover,.cbi-map>.cbi-section .cbi-value:nth-of-type(4n):hover,fieldset>table>tbody>tr:nth-of-type(4n):hover,table>tbody>tr:nth-of-type(4n):hover,div>.table>.tr:nth-of-type(4n):hover{background-color:rgba(250,250,250,0.05)}.cbi-rowstyle-2 .cbi-button-up,.cbi-rowstyle-2 .cbi-button-down,body:not(.Interfaces) .cbi-rowstyle-2:first-child{background-color:rgba(0,0,0,0,0.2) !important}.cbi-rowstyle-1 .cbi-button-up,.cbi-rowstyle-1 .cbi-button-down,body:not(.Interfaces) .cbi-rowstyle-1:first-child{background-color:rgba(0,0,0,0,0.1) !important}.status-bar{font-size:var(--font-x);color:#8391a2 !important;background-color:rgba(var(--primary-rgbbody),0.9)}.success{color:#ddd}.danger{color:#ddd}.errorbox{color:#ccc}h2{color:#bbb}h3{color:#bbb}.panel-title{color:#bbb}.tabs{margin:1rem;color:#b4c9e3}.tabs::-webkit-scrollbar-thumb{background-color:#555}.tabs::-webkit-scrollbar-track{background:transparent}.tabs>li{background:#343a40;box-shadow:0 0.5rem 1rem rgba(255,255,255,0.15)}.tabs li[class~="active"]{border-right:0.18751rem solid #fd8c73;border-left:0.18751rem solid #fd8c73;box-shadow:0 0.5rem 1rem rgba(255,255,255,0.15);background-color:rgba(255,255,255,0.2)}.tabs li[class~="hover"]{background-color:rgba(255,255,255,0.2)}.tabs li:hover{box-shadow:0 0.5rem 1rem rgba(255,255,255,0.35);background-color:rgba(255,255,255,0.2)}.tabs li[class~="active"] a{color:#bbb}.tabs li:hover a{color:#bbb}.tabs li a{color:#8391a2}.cbi-tabmenu{color:#8391a2}.cbi-tabmenu::-webkit-scrollbar{width:5px;height:5px}.cbi-tabmenu::-webkit-scrollbar-thumb{background-color:#555}.cbi-tabmenu li{background:#343a40;font-size:1rem;border-radius:0.25rem;box-shadow:0 0.5rem 1rem rgba(255,255,255,0.15)}.cbi-tabmenu li a{color:##8391a2}.cbi-tabmenu li:hover{color:#bbb;box-shadow:0 0.5rem 1rem rgba(255,255,255,0.35);background-color:rgba(255,255,255,0.2)}.cbi-tabmenu li:hover a{color:#bbb}.cbi-tabmenu li[class~="cbi-tab"]{border-right:0.18751rem solid #fd8c73;border-left:0.18751rem solid #fd8c73;box-shadow:0 0.5rem 1rem rgba(255,255,255,0.15);background-color:rgba(255,255,255,0.2)}.cbi-tabmenu li[class~="cbi-tab"] a{color:#bbb}.cbi-tab-descr{color:#8391a2}.cbi-dropdown>.open{background:#333}.cbi-dropdown>.more,.cbi-dropdown>ul>li[placeholder]{text-shadow:1px 1px 0 #ccc}.cbi-dropdown[open]>ul.dropdown{background:#ccc}.cbi-dropdown[open]>ul.dropdown>li[selected]{background-color:#8391a2;color:#fff}.cbi-progressbar{color:#8391a2}.cbi-value-title{color:#8391a2}.cbi-section-descr{color:#8391a2}.cbi-map-descr{color:#8391a2}#content_syslog{box-shadow:0 0 1px rgba(255,255,255,0.12)}#syslog{color:#8391a2;font-family:monospace;background-color:rgba(0,0,0,0.1)}.request>.requestBody,.response .markdown-body,.markdown-body{color:#8391a2!important;background-color:rgba(255,255,255,0)!important}.bottom_wrapper .message_input_wrapper .message_input_text{background-color:rgba(255,255,255,0.35)!important;color:#d0d7de!important}#chatlog .response .markdown-body>pre{background-color:rgba(0,0,0,0.15)!important}#chatlog .response{background-color:rgba(255,255,255,0.03)!important}.ifacebox-head{color:#8391a2}.zonebadge{color:#8391a2}.zonebadge strong{color:#8391a2}.Reboot>.main>.main-right #maincontent .container p{color:#8391a2}.node-services-vssr .block h4{color:#8391a2}.node-services-vssr .status-bar{color:#8391a2;box-shadow:0 0 .5rem 0 rgba(0,0,0,0.35);background-color:rgba(0,0,0,0.1) !important}.node-services-vssr .block,.node-services-shadowsocksr>.block,.node-services-ssrpro>.block,.block,.node-services-bypass>.main .block,.node-services-vssr>.main .block,.main .block{color:#8391a2;background-color:rgba(255,255,255,0.08) !important}.node-services-shadowsocksr>.block:active,.node-services-ssrpro>.block:active,.block:active,.node-services-bypass>.main .block:active,.main .block:active,.node-services-shadowsocksr>.block:hover,.node-services-ssrpro>.block:hover,.block:hover,.node-services-bypass>.main .block:hover,.main .block:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 4px 6px rgba(0,0,0,0.35);background-color:rgba(250,250,250,0.1)}#cbi-openclash .CodeMirror.cm-s-idea.CodeMirror-wrap{background:rgba(0,0,0,0.1)!important;color:#adbcc9!important}#cbi-openclash .cm-s-material.CodeMirror{background-color:#1b4c53!important;color:#31b9c1!important}#cbi-openclash .card{background:linear-gradient(#337ab7,#a8bfcf)!important;box-shadow:0 8px 16px -8px rgba(255,255,255,0.5)!important}.node-services-adguardhome>.main .cbi-value .cbi-input-textarea{box-shadow:0 0 1px rgba(255,255,255,0.3)!important}.Software >.main table tr td:nth-last-child(1),.node-system-packages>.main table tr td:nth-last-child(1){color:#8391a2}.node-system-packages>.main .cbi-value>pre{background-color:rgba(0,0,0,0.22)}.Software >.main .cbi-section-node:first-child .cbi-value-last>div,.node-system-packages>.main .cbi-section-node:first-child .cbi-value-last>div{border-color:rgba(255,255,255,0.3) !important;background-color:rgba(255,255,255,0.22) !important}.node-system-packages>.main .cbi-section-node:first-child .cbi-value-last>div>div{background-color:rgba(var(--primary-rgbm),1)!important}.cbi-section{box-shadow:0px 1px 0px rgba(255,255,255,0.08)}.cbi-section em{color:#8391a2}.node-status-realtime table>tbody>tr>td,.node-status-realtime table>tfoot>tr>td,.node-status-realtime table>thead>tr>td{color:#8391a2;border-bottom:1px solid rgba(255,255,255,0.3)}.cbi-dynlist > .item > span{color:#aaa}.cbi-dropdown[open]>ul.dropdown{background-color:rgba(var(--primary-rgbbody),1)}.ifacebox{color:#bbb}.ifacebadge{background-color:#797d7f;color:#bbb}.cbi-dropdown > .open,.cbi-dropdown > .more{background-color:rgba(255,255,255,0)!important}@media screen and (max-width:992px){.main .main-left{-webkit-box-shadow:rgba(250 250 250,0.75) 0 0 20px -5px;box-shadow:rgba(250 250 250,0.75) 0 0 20px -5px}.showSide:hover{background-color:rgba(255,255,255,0.2)}table>tbody>tr>td,table>tfoot>tr>td,table>thead>tr>td{color:#8391a2}} diff --git a/openwrt-packages/luci-theme-kucat/htdocs/luci-static/kucat/css/style.css b/openwrt-packages/luci-theme-kucat/htdocs/luci-static/kucat/css/style.css index 83ce984e69..9ab69209e5 100644 --- a/openwrt-packages/luci-theme-kucat/htdocs/luci-static/kucat/css/style.css +++ b/openwrt-packages/luci-theme-kucat/htdocs/luci-static/kucat/css/style.css @@ -283,44 +283,6 @@ --menu-hover-barbgcolor: rgba(255,255,255,0.3); } -[data-theme='light'] { - --primarytextcolor: #677087; - --primary-title-color: #4d4d5d; - --menu-color: #eee; - --menu-hover-color: #fff; - --menu-item-titlebg-color: rgba(var(--primary-rgbm),0.22); - --title-color: #65656b; - --body-color: #65656b; - --body-hover-bgcolor: rgba(50,50,50,0.05); - --inputbg-color: rgba(248,248,248,0.15); - --inputtext-color: #4d5256; - --inputborder-color: rgba(0,0,0,0.2); - --input-bgcolor: rgba(255,255,255,0.6); - --input-boxcolor: rgba(0,0,0,0.12); - --input-boxhovercolor: rgba(0,0,0,0.22); - --input-checkcolor: rgba(var(--primary-rgbm),1); - -} - -[data-theme="dark"] { - --primarytextcolor: #bbb; - --primary-title-color: #ccc; - --menu-color: #ddd; - --menu-hover-color: #f5f5f5f5; - --menu-item-titlebg-color: rgba(var(--primary-rgbm),0.5); - --title-color: #ddd; - --body-color: #bbb; - --body-hover-bgcolor: rgba(255,255,255,0.05); - --inputbg-color: rgba(255,255,255,0.11); - --inputtext-color: #ccc; - --inputborder-color: rgba(255,255,255,0.2); - --input-bgcolor: rgba(50,50,50,0.2); - --input-boxcolor: rgba(255,255,255,0.15); - --input-boxhovercolor: rgba(255,255,255,0.22); - --input-checkcolor: rgba(255,255,255,0.7); - -} - .tr { display: table-row; white-space: nowrap @@ -702,6 +664,28 @@ footer>a { background-color: rgba(255, 255, 255, 0); display: none; } +#view { + display: flex; + flex-direction: column; + gap: 1rem; +} +#view > .spinning { + position: fixed; + top: 50%; + left: 50%; + transform: translateX(-50%) translateY(-50%); + padding: 1.5rem; + border-radius: 0.25rem; + background-color: rgba(var(--primary-rgbbody), 1); + color: var(--body-color); + box-shadow: 0 .1rem .5rem .2rem var(--input-boxcolor); +} +#view > div:first-child { + display: flex; + color: var(--body-color); + flex-direction: column; +} + small { font-size: 90%; line-height: 1.42857143; @@ -737,7 +721,7 @@ small { padding: 0; border-radius: var(--radius2); background-color: rgba(var(--primary-rgbm),1); - box-shadow: 0 0.5rem 1rem rgba(0,0,0,0.15); + box-shadow: 0 0.1rem 0.3rem var(--input-boxcolor); background-image: -webkit-linear-gradient(135deg,rgba(255,255,255,0.2) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.2) 50%,rgba(255,255,255,0.2) 75%,transparent 75%,transparent) !important; transition: all .1s ease; -moz-osx-font-smoothing: grayscale; @@ -1065,13 +1049,38 @@ span[data-indicator="uci-changes"],#indicators span[data-indicator="poll-status" border-radius: var(--radius1); } - -.theme-switcher .active { - display: inline-block; +.loading-spinner { + display: inline-block; + width: 1.5rem; + height: 1.5rem; + border: 2px solid transparent; + border-top: 2px solid var(--menu-hover-color); + border-radius: 50%; + animation: spin 1s linear infinite; } -.theme-switcher>span:not(.active) { - display: none; +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +.theme-switcher { + cursor: pointer; + transition: opacity 0.3s ease; + position: relative; +} + +.theme-switcher:disabled { + cursor: not-allowed; + opacity: 0.5; +} + +[data-theme="dark"] .pdboy-light:before { + color: #aaa !important; +} + +[data-theme="light"] .pdboy-dark:before { + color: #aaa !important; } @@ -1425,7 +1434,7 @@ h5 { font-weight: bold } -.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-opkg"] #maincontent>.container { +.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-opkg"] #maincontent>.container { font-family: inherit; font-weight: normal; font-style: normal; @@ -1563,16 +1572,16 @@ table>tbody>tr:first-child>td,table>tfoot>tr:first-child>td,table>thead>tr:first border-top: 0px solid #eee } -#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 { +#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 { border-top: 0 !important; line-height: 1.2 } -[data-page="admin-network-diagnostics"] .tr>.td { +[data-page*="admin-network-diagnostics"] .tr>.td { white-space: normal } -[data-page="admin-network-diagnostics"] .cbi-dropdown>ul { +[data-page*="admin-network-diagnostics"] .cbi-dropdown>ul { overflow-y: hidden } @@ -1594,7 +1603,7 @@ table>tbody>tr:first-child>td,table>tfoot>tr:first-child>td,table>thead>tr:first border: 1px solid var(--inputborder-color)!important; transition: box-shadow .25s ease; border-radius: var(--radius2); - box-shadow: 0 0.3rem 0.8rem var(--input-boxcolor) + box-shadow: 0 0.1rem 0.3rem var(--input-boxcolor) } .btn,button,.cbi-button,.item::after { @@ -1615,7 +1624,7 @@ table>tbody>tr:first-child>td,table>tfoot>tr:first-child>td,table>thead>tr:first font-size: var(--font-z); color: var(--menu-hover-color); background-color: #008b89; - box-shadow: 0 0.3rem 0.8rem var(--input-boxcolor); + box-shadow: 0 0.1rem 0.3rem var(--input-boxcolor); border-radius: var(--radius2); background-image: var(--bgqs-image) } @@ -1703,7 +1712,7 @@ table table,.table .table,.cbi-value-field table,.cbi-value-field .table,td>tabl align-items: center } -[data-page="admin-network-network"] #view .td.cbi-section-actions>*,[data-page="admin-network-network"] #view .td.cbi-section-actions>*>* { +[data-page*="admin-network-network"] #view .td.cbi-section-actions>*,[data-page*="admin-network-network"] #view .td.cbi-section-actions>*>* { display: unset } @@ -1718,15 +1727,15 @@ table table,.table .table,.cbi-value-field table,.cbi-value-field .table,td>tabl .btn:focus,.cbi-button:focus { color: var(--menu-hover-color); - box-shadow: 0 0.5rem 1rem var(--input-boxhovercolor); - -webkit-box-shadow: 0 0.5rem 1rem var(--input-boxhovercolor); - -moz-box-shadow: 0 0.5rem 1rem var(--input-boxhovercolor) + box-shadow: 0 0.3rem 0.5rem var(--input-boxhovercolor); + -webkit-box-shadow: 0 0.3rem 0.5rem var(--input-boxhovercolor); + -moz-box-shadow: 0 0.3rem 0.5rem var(--input-boxhovercolor) } button:hover,.btn:hover,.cbi-button:hover { - box-shadow: 0 0.5rem 1rem var(--input-boxhovercolor); - -webkit-box-shadow: 0 0.5rem 1rem var(--input-boxhovercolor); - -moz-box-shadow: 0 0.5rem 1rem var(--input-boxhovercolor) + box-shadow: 0 0.3rem 0.5rem var(--input-boxhovercolor); + -webkit-box-shadow: 0 0.3rem 0.5rem var(--input-boxhovercolor); + -moz-box-shadow: 0 0.3rem 0.5rem var(--input-boxhovercolor) } .btn:active,.cbi-button:active,button:active { @@ -1802,13 +1811,13 @@ button:hover,.btn:hover,.cbi-button:hover { .tabs li[class~="active"] { border-right: 0.18751rem solid var(--primary-solid) !important; border-left: 0.18751rem solid var(--primary-solid) !important; - box-shadow: 0 0.5rem 1rem var(--input-boxhovercolor); + box-shadow: 0 0.3rem 0.5rem var(--input-boxhovercolor); background-color: rgba(var(--primary-rgbm),0.7) } .tabs>li:hover { background: rgba(var(--primary-rgbm),0.7); - box-shadow: 0 0.5rem 1rem var(--input-boxhovercolor) + box-shadow: 0 0.3rem 0.5rem var(--input-boxhovercolor) } .tabs li[class~="active"] a { @@ -1844,7 +1853,7 @@ button:hover,.btn:hover,.cbi-button:hover { border-radius: var(--radius2); padding: 0.5rem 0.2rem; line-height: 1.5; - box-shadow: 0 0.5rem 1rem var(--input-boxcolor); + box-shadow: 0 0.1rem 0.3rem var(--input-boxcolor); background: var(--menu-item-titlebg-color); margin: 0.2rem 0rem 0.2rem 0.4rem !important } @@ -1858,7 +1867,7 @@ button:hover,.btn:hover,.cbi-button:hover { .cbi-tabmenu>li:hover { color: var(--menu-hover-color); background: rgba(var(--primary-rgbm),0.7); - box-shadow: 0 0.5rem 1rem var(--input-boxhovercolor); + box-shadow: 0 0.3rem 0.5rem var(--input-boxhovercolor); margin-bottom: 0 } @@ -1869,7 +1878,7 @@ button:hover,.btn:hover,.cbi-button:hover { .cbi-tabmenu>li[class~="cbi-tab"] { border-right: 0.18751rem solid var(--primary-solid) !important; border-left: 0.18751rem solid var(--primary-solid) !important; - box-shadow: 0 0.5rem 1rem var(--input-boxcolor); + box-shadow: 0 0.1rem 0.3rem var(--input-boxcolor); background-color: rgba(var(--primary-rgbm),0.6) } @@ -1906,7 +1915,7 @@ button:hover,.btn:hover,.cbi-button:hover { display: table-cell } -[data-page="admin-network-network"] .cbi-value>.cbi-value-field { +[data-page*="admin-network-network"] .cbi-value>.cbi-value-field { line-height: 1.25 } @@ -2059,7 +2068,7 @@ button:hover,.btn:hover,.cbi-button:hover { display: inline-flex; flex-wrap: nowrap; position: relative; - box-shadow: 0 0.3rem 0.8rem var(--input-boxcolor); + box-shadow: 0 0.1rem 0.3rem var(--input-boxcolor); width: 100%; pointer-events: auto; margin-top: 0.2rem; @@ -2365,7 +2374,7 @@ button:hover,.btn:hover,.cbi-button:hover { background-color: rgba(var(--primary-rgbbody), 1); color: var(--inputtext-color); margin-left: 0 !important; - margin-top: 0.25rem; + margin-top: 0rem; left: 0 !important; cursor: pointer; } @@ -2656,11 +2665,11 @@ select,input { background-color: #f0ad4e !important } -[data-page="admin-system-flash"] .cbi-value,[data-page="admin-system-flash"] .cbi-section-node,[data-page="admin-system-flash"] .cbi-section .cbi-section { +[data-page*="admin-system-flash"] .cbi-value,[data-page*="admin-system-flash"] .cbi-section-node,[data-page*="admin-system-flash"] .cbi-section .cbi-section { padding: 0 } -[data-page="admin-system-flash"] legend { +[data-page*="admin-system-flash"] legend { display: block !important; font-size: 1.2rem; width: 100%; @@ -2675,11 +2684,11 @@ select,input { font-weight: bold } -[data-page="admin-system-flash"] .cbi-section-descr { +[data-page*="admin-system-flash"] .cbi-section-descr { font-weight: 600 } -[data-page="admin-system-flash"] .modal label.btn { +[data-page*="admin-system-flash"] .modal label.btn { background-color: rgba(255,255,255,0) } @@ -2691,7 +2700,7 @@ select,input { margin-left: 0 !important } -[data-page="admin-system-flash"] .modal>p>.btn { +[data-page*="admin-system-flash"] .modal>p>.btn { white-space: normal !important; font-size: var(--font-x); margin: 0; @@ -2703,11 +2712,11 @@ select,input { box-shadow: none } -[data-page="admin-system-flash"] .modal>.right,[data-page="admin-system-flash"] .modal>.right::before { +[data-page*="admin-system-flash"] .modal>.right,[data-page*="admin-system-flash"] .modal>.right::before { margin: 3rem 5px 0 5px } -[data-page="admin-system-flash"] .modal>.right>.btn { +[data-page*="admin-system-flash"] .modal>.right>.btn { color: #f8f8f8 } @@ -2799,11 +2808,11 @@ body.modal-overlay-active #modal_overlay { display: inline } -[data-page="admin-system-system"] .control-group { +[data-page*="admin-system-system"] .control-group { margin-top: 0.5rem } -[data-page="admin-control-autotimeset-startuptask"] .cbi-input-textarea,[data-page="admin-control-autotimeset-scheduledtask"] .cbi-input-textarea { +[data-page*="admin-control-autotimeset"] .cbi-input-textarea,[data-page*="admin-control-autotimeset"] .cbi-input-textarea { min-width: 30rem } @@ -3007,7 +3016,7 @@ td>.ifacebadge,.td>.ifacebadge { overflow: hidden } -#iwsvg,[data-page="admin-status-realtime-bandwidth"] #bwsvg { +#iwsvg,[data-page*="admin-status-realtime-bandwidth"] #bwsvg { border-top: 0 !important } @@ -3213,7 +3222,7 @@ label[data-index][data-depends] { opacity: 0 } -#diag-rc-output>pre,#command-rc-output>pre,[data-page="admin-services-wol"] .notice code { +#diag-rc-output>pre,#command-rc-output>pre,[data-page*="admin-services-wol"] .notice code { font-size: var(--font-x); font-size-adjust: .35; line-height: normal; @@ -3225,10 +3234,10 @@ label[data-index][data-depends] { box-shadow: 0 2px 2px 0 rgba(0,0,0,.16),0 0 2px 0 rgba(0,0,0,.12) } -[data-page="admin-network-diagnostics"] .table { +[data-page*="admin-network-diagnostics"] .table { box-shadow: none } -[data-page="admin-network-network"] .ifacebox .ifacebox-head { +[data-page*="admin-network-network"] .ifacebox .ifacebox-head { color: #4d4d5d } @@ -3351,6 +3360,11 @@ body.lang_pl.node-main-login .cbi-value-title { .node-main-login>.main>.main-right #maincontent>.container>form { backdrop-filter: none !important; padding: 1rem 1rem 3rem 1rem !important; + -webkit-backdrop-filter: blur(6px) !important; + backdrop-filter: blur(6px) !important; + box-shadow: 0 .1rem .4rem .2rem var(--input-boxcolor); + background-color: rgba(var(--primary-rgbbody), 0.5) !important; + border-radius: var(--radius1); border: none; width: 100%; } @@ -3359,17 +3373,13 @@ body.lang_pl.node-main-login .cbi-value-title { display: flex; flex-direction: column; flex-wrap: nowrap; - -webkit-backdrop-filter: blur(6px) !important; - backdrop-filter: blur(6px) !important; - background-color: rgba(var(--primary-rgbbody), 0.5) !important; + backdrop-filter: none !important; justify-content: center; align-items: center; } .node-main-login>.main .cbi-page-actions { padding: 2rem 1rem 3rem 1rem !important; - /* box-shadow: 3px 7px 12px rgba(0, 0, 0, 0.22); */ - border-radius: 0 0 var(--radius0) var(--radius0); } .node-main-login>.main>.main-right #maincontent>.container>form .alert-message { @@ -3377,8 +3387,6 @@ body.lang_pl.node-main-login .cbi-value-title { } .node-main-login>.main .cbi-map { - border-radius: var(--radius0) var(--radius0) 0 0; - /* box-shadow: 3px 7px 12px rgba(0, 0, 0, 0.22); */ padding: 1rem 1rem 1rem 1rem !important } @@ -3508,7 +3516,6 @@ body.lang_pl.node-main-login .cbi-value-title { position: relative; padding: 0rem; background-image: none !important; - margin-bottom: 1rem; border-bottom: 0px solid #222 !important; background-color: rgba(255,255,255,0) } @@ -3552,7 +3559,7 @@ body.lang_pl.node-main-login .cbi-value-title { text-decoration: none } -.node-status-overview>.main fieldset:nth-child(4) .td:nth-child(2),.node-status-processes>.main .table .tr .td:nth-child(3) { +[data-page*="admin-status-overview "]>.main fieldset:nth-child(4) .td:nth-child(2),[data-page*="admin-status-processes "]>.main .table .tr .td:nth-child(3) { white-space: normal } @@ -3585,16 +3592,16 @@ body.lang_pl.node-main-login .cbi-value-title { gap: 0px } -.node-admin-system-opkg .control-group { +[data-page*="admin-system-opkg"] .control-group { display: block } -[data-page="admin-system-opkg"] div.btn { +[data-page*="admin-system-opkg"] div.btn { line-height: 1.6; display: inline } -[data-page^="admin-system-admin"]:not(.node-main-login) .cbi-map:not(#cbi-dropbear) { +[data-page*="admin-system-admin"]:not(.node-main-login) .cbi-map:not(#cbi-dropbear) { margin-top: 2rem; padding-top: .1rem } @@ -3738,11 +3745,11 @@ body.lang_pl.node-main-login .cbi-value-title { margin-top: 2px } -[data-page^="admin-system-commands"] .panel-title,[data-page^="command-cfg"] .mobile-hide,[data-page^="command-cfg"] .showSide { +[data-page*="admin-system-commands"] .panel-title,[data-page*="command-cfg"] .mobile-hide,[data-page*="command-cfg"] .showSide { display: none } -[data-page^="admin-system-commands"] .panel-title,[data-page^="command-cfg"] .mobile-hide,[data-page^="command-cfg"] .showSide { +[data-page*="admin-system-commands"] .panel-title,[data-page*="command-cfg"] .mobile-hide,[data-page*="command-cfg"] .showSide { display: none } @@ -3758,7 +3765,7 @@ body.lang_pl.node-main-login .cbi-value-title { opacity: 0 } -.node-admin-status-hnet #maincontent .container>div>div { +[data-page*="admin-status-hnet"] #maincontent .container>div>div { border: none !important } @@ -3766,7 +3773,7 @@ body.lang_pl.node-main-login .cbi-value-title { margin: 0 1.5rem 1rem 1.5rem } -[data-page="admin-status-routes"] #view h3 { +[data-page*="admin-status-routes"] #view h3 { font-size: var(--font-d); line-height: 1; display: block; @@ -3780,7 +3787,7 @@ body.lang_pl.node-main-login .cbi-value-title { font-weight: bold } -[data-page="admin-status-routes"] #view table,[data-page="admin-status-processes"] #view table,.node-admin-status-realtime-connections #view table[id*=connections] { +[data-page*="admin-status-routes"] #view table,[data-page*="admin-status-processes"] #view table,[data-page*="admin-status-realtime"] #view table[id*=connections] { padding: 10px; border: 1px; font-weight: normal; @@ -3797,11 +3804,11 @@ body.lang_pl.node-main-login .cbi-value-title { margin-top: 5px } -.node-admin-status-realtime-connections #view table[id*=connections] { +[data-page*="admin-status-realtime"] #view table[id*=connections] { white-space: nowrap } -.node-admin-status-channel_analysis #view>div>div>div>div,.node-admin-status-channel_analysis #view>div>div>div>div>div,.node-admin-status-realtime-wireless #view>div>div>div>div,.node-admin-status-realtime-load #view div,.node-admin-status-realtime-bandwidth #view>div>div>div>div,.node-admin-status-realtime-connections #view div { +[data-page*="admin-status-channel_analysis"] #view>div>div>div>div,[data-page*="admin-status-channel_analysis"] #view>div>div>div>div>div,[data-page*="admin-status-realtime"] #view>div>div>div>div,[data-page*="admin-status-realtime"] #view div,[data-page*="admin-status-realtime"] #view>div>div>div>div,[data-page*="admin-status-realtime"]#view div { border: none !important; background-color: rgba(var(--primary-rgbbody),0.5) !important; border-radius: var(--radius2); @@ -3820,20 +3827,20 @@ body.lang_pl.node-main-login .cbi-value-title { padding-right: 5px } -[data-page="admin-system-ttyd-ttyd"] #view>iframe { +[data-page*="admin-system-ttyd-ttyd"] #view>iframe { border-radius: var(--radius2) !important; min-height: 600px !important } -[data-page="admin-status-overview"] h3 { +[data-page*="admin-status-overview"] h3 { color: unset !important } -[data-page="admin-network-dhcp"] h3 { +[data-page*="admin-network-dhcp"] h3 { margin: -2rem 1.5rem 0.2rem } -[data-page="admin-status-iptables"] .right { +[data-page*="admin-status-iptables"] .right { margin-bottom: 0rem !important } @@ -3864,23 +3871,23 @@ body.lang_pl.node-main-login .cbi-value-title { z-index: 500 } -.node-admin-nlbw-display .cbi-section ul { +[data-page*="admin-nlbw-display"] .cbi-section ul { padding: 0.875rem 1.5rem } -.node-admin-nlbw-backup form { +[data-page*="admin-nlbw-backup"] form { margin-left: 1.5rem } -.node-admin-nas-usb_printer em { +[data-page*="admin-nas-usb_printer"] em { display: block } -.node-admin-nas-usb_printer em { +[data-page*="admin-nas-usb_printer"] em { display: block } -[data-page="admin-system-flashops"] .cbi-section ul { +[data-page*="admin-system-flash"] .cbi-section ul { padding: .875rem 1.5rem; font-size: var(--font-x) } @@ -3903,16 +3910,16 @@ body.lang_pl.node-main-login .cbi-value-title { background-color: rgba(255,255,255,0.2) !important } -[data-page="admin-status-usage-details"] .cbi-value-title { +[data-page*="admin-status-usage-details"] .cbi-value-title { width: 16rem } -[data-page="admin-status-processes"] #view td:nth-child(3)>span,.cbi-map>.cbi-section .cbi-value:nth-of-type(4) td:nth-child(2),.Interfaces>.main #view td:nth-child(3),[data-page="admin-network-network"]>.main #view td:nth-child(3),[data-page="admin-status-processes"]>.main #view td:nth-child(3),[data-page="admin-status-overview"]>.main #view td:nth-child(2) { +[data-page*="admin-status-processes"] #view td:nth-child(3)>span,.cbi-map>.cbi-section .cbi-value:nth-of-type(4) td:nth-child(2),.Interfaces>.main #view td:nth-child(3),[data-page*="admin-network-network"]>.main #view td:nth-child(3),[data-page*="admin-status-processes"]>.main #view td:nth-child(3),[data-page*="admin-status-overview"]>.main #view td:nth-child(2) { white-space: normal !important; word-break: unset !important } -[data-page="admin-status-overview"] #view .cbi-section>div>div { +[data-page*="admin-status-overview"] #view .cbi-section>div>div { justify-items: center !important } @@ -3924,66 +3931,56 @@ body.lang_pl.node-main-login .cbi-value-title { width: 4rem !important } -[data-page="admin-nlbw-usage"]>.main .tr.table-totals,[data-page="admin-nlbw-usage"]>.main .cbi-progressbar { +[data-page*="admin-nlbw-usage"]>.main .tr.table-totals,[data-page*="admin-nlbw-usage"]>.main .cbi-progressbar { background-color: var(--inputbg-color) !important } - -[data-page="admin-services-vssr"] .ssr-button { - margin-left: .3rem -} - -.pure-g .block h4, -[data-page="admin-services-vssr"] .block h4 { +.pure-g .block h4 { color: var(--body-color)!important; - background-image: none!important + background-image: none!important; + background-color: rgba(255,255,255,0) !important; + white-space: nowrap; + text-align: center; + + margin: 1rem 0rem 1rem 0rem; } -[data-page="admin-services-vssr"] .status-bar { - color: var(--body-color); - box-shadow: 0 0 .5rem 0 var(--inputbg-color); - background-color: var(--inputbg-color) !important -} - -.pure-g .block, -[data-page="admin-services-vssr"] .block, -[data-page="admin-services-shadowsocksr"] >.block, +[data-page*="admin-services-passwall"] .pure-g .block, +[data-page*="admin-services-shadowsocksr"] >.block, .block, -[data-page="admin-services-bypass"] >.main .block, -[data-page="admin-services-vssr"] >.main .block, +[data-page*="admin-services-bypass"] >.main .block, .main .block { color: var(--body-color); - background-color: var(--input-bgcolor) !important; - box-shadow: 0 0 1px var(--inputborder-color); - box-shadow: 0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.32),0 1px 5px 0 rgba(0,0,0,0.2) + background-color: rgba(var(--primary-rgbbody),0.7) !important; + box-shadow: 0 0.1rem 0.3rem var(--input-boxcolor); } -[data-page="admin-services-shadowsocksr"]>.block:active, +[data-page*="admin-services-shadowsocksr"]>.block:active, .block:active, -[data-page="admin-services-bypass"]>.main .block:active, +[data-page*="admin-services-bypass"]>.main .block:active, .main .block:active, -[data-page="admin-services-shadowsocksr"]>.block:hover, +[data-page*="admin-services-shadowsocksr"]>.block:hover, .block:hover, -[data-page="admin-services-bypass"]>.main .block:hover, +[data-page*="admin-services-bypass"]>.main .block:hover, .main .block:hover { - box-shadow: inset 0 1px 0 rgba(255,255,255,0.2),0 4px 6px rgba(0,0,0,0.35); - background-color: var(--input-boxhovercolor) !important + box-shadow: 0 0.3rem 0.5rem var(--input-boxhovercolor); + background-color: rgba(var(--primary-rgbbody),0.3) !important; } -[data-page="admin-services-samba"]>.main .cbi-tabcontainer:nth-child(3) .cbi-value-title { +[data-page*="admin-services-samba"]>.main .cbi-tabcontainer:nth-child(3) .cbi-value-title { margin-bottom: 1rem; width: auto } -[data-page="admin-services-samba"]>.main .cbi-tabcontainer:nth-child(3) .cbi-value-field { +[data-page*="admin-services-samba"]>.main .cbi-tabcontainer:nth-child(3) .cbi-value-field { display: list-item } -[data-page="admin-services-samba"]>.main .cbi-tabcontainer:nth-child(3) .cbi-value-description { +[data-page*="admin-services-samba"]>.main .cbi-tabcontainer:nth-child(3) .cbi-value-description { padding-top: 1rem } -[data-page="admin-services-adguardhome"]>.main .cbi-value-field { +[data-page*="admin-services-adguardhome"]>.main .cbi-value-field { width: 27% !important } @@ -4009,49 +4006,49 @@ pre.command-output { padding: 1.5rem } -[data-page="admin-nlbw-display"] .cbi-section[data-tab="export"] { +[data-page*="admin-nlbw-display"] .cbi-section[data-tab="export"] { padding: 1.5rem !important } -[data-page="admin-nlbw-backup"] form { +[data-page*="admin-nlbw-backup"] form { padding-left: 1.5rem } -[data-page="admin-status-iptables"] .right { +[data-page*="admin-status-iptables"] .right { margin-bottom: 0 !important } -[data-page="admin-services-ttyd"] .container { +[data-page*="admin-services-ttyd"] .container { display: flex; flex-direction: column } -[data-page="admin-services-ttyd"] #view { +[data-page*="admin-services-ttyd"] #view { flex: 1 } -[data-page="admin-services-ttyd"] #view iframe { +[data-page*="admin-services-ttyd"] #view iframe { height: 100% } -[data-page="admin-system-fileassistant"] .fb-container .panel-title { +[data-page*="admin-system-fileassistant"] .fb-container .panel-title { padding: .5rem .75rem !important } -[data-page="admin-system-fileassistant"] .cbi-section.fb-container { +[data-page*="admin-system-fileassistant"] .cbi-section.fb-container { padding: .5rem } -[data-page="admin-system-fileassistant"] .fb-container .panel-container { +[data-page*="admin-system-fileassistant"] .fb-container .panel-container { border-bottom-color: #dee2e6 } /* openclash */ -[data-page^="admin-services-openclash"] .cbi-tabmenu>li:last-child { +[data-page*="admin-services-openclash"] .cbi-tabmenu>li:last-child { margin-right: 0 !important } -[data-page^="admin-services-openclash"] .cbi-section .oc{ +[data-page*="admin-services-openclash"] .cbi-section .oc{ --bg-white: rgba(var(--primary-rgbbody), 0.4); --bg-light: rgba(255, 255, 255, 0); --bg-gray: rgba(var(--primary-rgbm), 0.02); @@ -4061,87 +4058,101 @@ pre.command-output { --border-light: rgba(255, 255, 255, 0); --text-primary: var(--inputtext-color); } -[data-page^="admin-services-openclash"] .select-class { +[data-page*="admin-services-openclash"] .select-class { background-color: rgba(255,255,255,0) !important; padding: 0 20px 0 10px!important; } -[data-page^="admin-services-openclash"] .oc .myip-ip-item, -[data-page^="admin-services-openclash"] .oc .myip-check-item { +[data-page*="admin-services-openclash"] .oc .myip-ip-item, +[data-page*="admin-services-openclash"] .oc .myip-check-item { background-color: rgba(var(--primary-rgbbody),0.2) !important; border: 1px solid rgba(var(--primary-rgbm),0.2); } -[data-page^="admin-services-openclash"] .oc .sub-card { +[data-page*="admin-services-openclash"] .oc .sub-card { border: 1px solid rgba(var(--primary-rgbm),0.2) !important; } -[data-page^="admin-services-openclash"] .oc .main-card { +[data-page*="admin-services-openclash"] .oc .main-card { border: 0px solid rgba(var(--primary-rgbm),0.1) !important; } -[data-page^="admin-services-openclash"] #tab-content .dom { +[data-page*="admin-services-openclash"] #tab-content .dom { padding: 0 1rem 1rem 1rem } -[data-page^="admin-services-openclash"] .cbi-input-file { +[data-page*="admin-services-openclash"] .cbi-input-file { padding: .2813rem; box-sizing: content-box; width: 15rem !important } -[data-page^="admin-services-openclash"] [id="container.openclash.config.debug"] fieldset { +[data-page*="admin-services-openclash"] [id="container.openclash.config.debug"] fieldset { border: none !important; padding: 1rem !important } -[data-page^="admin-services-openclash"] #debug-rc-output>textarea { +[data-page*="admin-services-openclash"] #debug-rc-output>textarea { font-family: 'Google Sans' !important } -[data-page^="admin-services-openclash"] .CodeMirror { +[data-page*="admin-services-openclash"] .CodeMirror { font-size: inherit; background-color: rgba(0,0,0,0.8) !important; color: var(--body-color) !important; font-family: 'Google Sans' !important } -[data-page^="admin-services-openclash"] .cbi-button-up,[data-page^="admin-services-openclash"] .cbi-button-down { +[data-page*="admin-services-openclash"] .cbi-button-up,[data-page*="admin-services-openclash"] .cbi-button-down { padding: .8rem 1.5rem; font-size: 0 } -[data-page^="admin-services-openclash"] select#CORE_VERSION,[data-page^="admin-services-openclash"] select#RELEASE_BRANCH { +[data-page*="admin-services-openclash"] select#CORE_VERSION,[data-page*="admin-services-openclash"] select#RELEASE_BRANCH { width: auto } -[data-page^="admin-services-openclash"] .cbi-section>div>ul>li { +[data-page*="admin-services-openclash"] .cbi-section>div>ul>li { width: auto !important; padding: 0rem 0.5rem !important } -[data-page^="admin-services-openclash"] .CodeMirror-merge,#cbi-openclash .CodeMirror-merge-2pane { +[data-page*="admin-services-openclash"] .CodeMirror-merge,#cbi-openclash .CodeMirror-merge-2pane { height: auto !important; border: none !important } -[data-page^="admin-services-openclash"] .cm-s-idea span.cm-variable { +[data-page*="admin-services-openclash"] .cm-s-idea span.cm-variable { color: #fd8c73 !important } -[data-page^="admin-services-openclash"] .CodeMirror-merge-scrolllock-wrap>.CodeMirror-merge-scrolllock { +[data-page*="admin-services-openclash"] .CodeMirror-merge-scrolllock-wrap>.CodeMirror-merge-scrolllock { color: var(--inputtext-color) !important } -[data-page^="admin-services-openclash"] .CodeMirror-merge>.CodeMirror-merge-gap { +[data-page*="admin-services-openclash"] .CodeMirror-merge>.CodeMirror-merge-gap { background-color: rgba(255,255,255,0.12) !important } -[data-page^="admin-services-openclash"] .CodeMirror-scroll>.CodeMirror-gutters { +[data-page*="admin-services-openclash"] .CodeMirror-scroll>.CodeMirror-gutters { background-color: rgba(255,255,255,0.1) !important; border-right: 1px solid #777 !important } + +[data-page*="admin-services-openclash"] .cbi-section, +[data-page*="admin-services-openclash"] .cbi-section>div, +[data-page*="admin-services-openclash"] .cbi-tabmenu{ + background-color: rgba(var(--primary-rgbbody), 0.2) !important; + border: 0px solid #ddd !important; + box-shadow: none !important; +} + +[data-page*="admin-services-openclash"] #tab { + border: 0px solid #ddd !important; + box-shadow: none !important; +} + #cbi-nikki-proxy .cbi-value-field, #cbi-nikki-proxy .cbi-section-table-row>.cbi-value-field .cbi-dropdown, #cbi-nikki-proxy .cbi-value-field .cbi-dropdown, @@ -4286,53 +4297,49 @@ border-bottom: 0px solid #f1f5f9!important; border-top: 1px solid var(--inputborder-color)!important; } -[data-page="admin-services-adguardhome"]>.main .cbi-value .cbi-input-textarea { +[data-page*="admin-services-adguardhome"]>.main .cbi-value .cbi-input-textarea { width: 100% !important; box-shadow: 0 0 1px var(--input-boxcolor) !important } -[data-page="admin-system-packages"]>.main .cbi-page-actions { +[data-page*="admin-system-packages"]>.main .cbi-page-actions { padding: 1rem 0 } -[data-page="admin-system-leds"] .cbi-section em { +[data-page*="admin-system-leds"] .cbi-section em { display: block } -[data-page="admin-store-pages"] .cbi-section>.tags-container>.tags-value,[data-page="admin-store-pages"] .cbi-section>.sort-container>.sort-value { +[data-page*="admin-store-pages"] .cbi-section>.tags-container>.tags-value,[data-page*="admin-store-pages"] .cbi-section>.sort-container>.sort-value { flex: none } -[data-page="admin-store-pages"] .app-container .app-btns .app-btn { +[data-page*="admin-store-pages"] .app-container .app-btns .app-btn { padding: 0.5rem; line-height: 1.4 } -[data-page="admin-system-package-manager"] .modal>textarea { +[data-page*="admin-system-package-manager"] .modal>textarea { white-space: nowrap } -[data-page="admin-status-overview"] #view>div { - padding: 0rem 0rem 1rem 0.5rem; -} -.main>.main-left,.cbi-section,[data-tab-title],[data-page^="admin-system-admin"]:not(.node-main-login) .cbi-map:not(#cbi-dropbear),#maincontent>.container>form,#maincontent>.container>form>div,.tabs,.cbi-tabmenu,.cbi-tooltip,#view>p,#view>div,#view>table { +.main>.main-left,.cbi-section,[data-tab-title],[data-page*="admin-system-admin"]:not(.node-main-login) .cbi-map:not(#cbi-dropbear),#maincontent>.container>form,#maincontent>.container>form>div,.tabs,.cbi-tabmenu,.cbi-tooltip,#view>p,#view>div,#view>table { backdrop-filter: var(--ufilter); - padding-bottom: 1rem; -webkit-backdrop-filter: var(--ufilter) } -#maincontent>.container>#view,[data-page="admin-status-routes"] #view,[data-page="admin-network-diagnostics"] #view,[data-page="admin-status-processes"] #view { +#maincontent>.container>#view,[data-page*="admin-status-routes"] #view,[data-page*="admin-network-diagnostics"] #view,[data-page*="admin-status-processes"] #view { min-width: inherit; overflow-x: auto; overflow-y: hidden } -[data-page="admin-system-poweroff"] #maincontent>.container>#view, -[data-page="admin-system-reboot"] #maincontent>.container>#view,[data-page="admin-system-poweroffdevice"] #maincontent .container { +[data-page*="admin-system-poweroff"] #maincontent>.container>#view, +[data-page*="admin-system-reboot"] #maincontent>.container>#view,[data-page*="admin-system-poweroffdevice"] #maincontent .container { padding: 0 1rem 3rem 1rem } -[data-page="admin-network-diagnostics"] #view .table { +[data-page*="admin-network-diagnostics"] #view .table { margin-top: 2rem } @@ -4492,11 +4499,11 @@ div#add_link_div { font-size: var(--font-x) } -[data-page="admin-network-firewall-forwards"] .table:not(.cbi-section-table) { +[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 { +[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 } @@ -4504,23 +4511,23 @@ div#add_link_div { width: 32% !important } -[data-page="admin-network-network"] .cbi-section-table tr,[data-page="admin-network-network"] .cbi-section-table td { +[data-page*="admin-network-network"] .cbi-section-table tr,[data-page*="admin-network-network"] .cbi-section-table td { font-size: var(--font-x) !important } -[data-page="admin-network-network"] .cbi-section-node table td:nth-of-type(1) { +[data-page*="admin-network-network"] .cbi-section-node table td:nth-of-type(1) { padding: 5px !important } -[data-page="admin-network-network"] .cbi-section-node table td,[data-page="admin-network-wireless"] fieldset .cbi-section-node table td { +[data-page*="admin-network-network"] .cbi-section-node table td,[data-page*="admin-network-wireless"] fieldset .cbi-section-node table td { padding: 10px !important } -[data-page="admin-network-network"] .cbi-section-table br { +[data-page*="admin-network-network"] .cbi-section-table br { display: initial } -[data-page="admin-network-network"] .cbi-section-table tr, [data-page="admin-network-network"] .cbi-section-table td, -[data-page="admin-network-network"] .cbi-network-interface .tr.cbi-section-table-row>.cbi-value-field { +[data-page*="admin-network-network"] .cbi-section-table tr, [data-page*="admin-network-network"] .cbi-section-table td, +[data-page*="admin-network-network"] .cbi-network-interface .tr.cbi-section-table-row>.cbi-value-field { width: auto; } @@ -4553,6 +4560,7 @@ div#add_link_div { .cbi-dynlist>.add-item:not([ondrop])>input,.cbi-dynlist>.item>span,.cbi-dynlist>.add-item input { min-width: 8rem; + box-shadow: 0 0.1rem 0.3rem var(--input-boxcolor); width: 30rem; } @@ -4600,7 +4608,7 @@ div#add_link_div { font-size:var(--font-d) } - .node-admin-status-iptables>.main fieldset li>a { + [data-page*="admin-status-iptables"]>.main fieldset li>a { padding: .3rem .6rem } @@ -4616,7 +4624,7 @@ div#add_link_div { 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 { + [data-page*="admin-network-firewall"] .table:not(.cbi-section-table),[data-page*="admin-network-firewall"] .table:not(.cbi-section-table),[data-page*="admin-network-hosts"] .table,[data-page*="admin-network-routes"] .table { overflow-y: visible } @@ -4628,9 +4636,6 @@ div#add_link_div { min-width: 9rem } - .node-admin-status>.main fieldset li>a { - padding: .3rem .6rem - } .tabs>li>a,.cbi-tabmenu>li>a { padding: .2rem .5rem @@ -4672,7 +4677,7 @@ div#add_link_div { overflow-y: hidden } - #diag-rc-output>pre,#command-rc-output>pre,[data-page="admin-services-wol"] .notice code { + #diag-rc-output>pre,#command-rc-output>pre,[data-page*="admin-services-wol"] .notice code { font-size: var(--font-x) } @@ -4710,8 +4715,8 @@ div#add_link_div { display: none !important } - [data-page="admin-status-overview"] .main #view td:nth-child(1) { - width: 6rem + [data-page*="admin-status-overview"] .main #view td:nth-child(1) { + width: 8rem } .modal .cbi-value-title,.cbi-value-title { @@ -4723,7 +4728,7 @@ div#add_link_div { overflow-x: hidden } - [data-page="admin-status-overview"] .table[width="100%"]>.tr { + [data-page*="admin-status-overview"] .table[width="100%"]>.tr { flex-wrap: nowrap } @@ -4755,7 +4760,7 @@ div#add_link_div { flex: 1 1 100% } - [data-page^="admin-status-realtime"] .td[id] { + [data-page*="admin-status-realtime"] .td[id] { text-align: left } .cbi-tab-descr { @@ -4799,19 +4804,6 @@ div#add_link_div { padding: 1rem 0.5rem } - [data-page="admin-services-vssr"] .status-info { - font-size: var(--font-x) - } - - [data-page="admin-services-vssr"] .icon-con { - margin-top: 0.4rem - } - - [data-page="admin-services-vssr"] .icon-con img { - width: 2.3rem !important; - height: auto - } - #ethinfo td { padding: 0.75rem 0.2rem !important } @@ -4904,7 +4896,7 @@ div#add_link_div { margin: 0.1em auto } - [data-page="admin-status-processes"] .td[data-title="Hang Up"]::before,[data-page="admin-status-processes"] .td[data-title="Terminate"]::before,[data-page="admin-status-processes"] .td[data-title="Kill"]::before { + [data-page*="admin-status-processes"] .td[data-title="Hang Up"]::before,[data-page*="admin-status-processes"] .td[data-title="Terminate"]::before,[data-page*="admin-status-processes"] .td[data-title="Kill"]::before { display: none } @@ -4912,7 +4904,7 @@ div#add_link_div { display: none } - [data-page="admin-system-admin-password"] .control-group { + [data-page*="admin-system-admin-password"] .control-group { flex-wrap: nowrap } @@ -4974,7 +4966,7 @@ div#add_link_div { line-height: 1 } - #diag-rc-output>pre,#command-rc-output>pre,[data-page="admin-services-wol"] .notice code { + #diag-rc-output>pre,#command-rc-output>pre,[data-page*="admin-services-wol"] .notice code { font-size: var(--font-x) !important } @@ -4982,15 +4974,15 @@ div#add_link_div { padding: 0.5rem 1rem } - [data-page="admin-system-flash"] legend { + [data-page*="admin-system-flash"] legend { padding: 1rem 0 1rem 1rem } - [data-page="admin-system-flash"] .cbi-value { + [data-page*="admin-system-flash"] .cbi-value { padding: 0 0 0 1rem } - [data-page="admin-network-dhcp"] [data-tab-active="true"] { + [data-page*="admin-network-dhcp"] [data-tab-active="true"] { padding: 0 !important } .cbi-value:first-child { @@ -5026,7 +5018,7 @@ div#add_link_div { flex-wrap: wrap } } - + @media (max-width: 600px) { .app-item { width: 50%!important @@ -5034,8 +5026,7 @@ div#add_link_div { } @media only screen and (max-width: 480px) { - [data-page="admin-status-overview"] .main #view td:nth-child(1) { - max-width:8rem; + [data-page*="admin-status-overview"] .main #view td:nth-child(1) { white-space: normal !important } diff --git a/openwrt-packages/luci-theme-kucat/htdocs/luci-static/kucat/css/theme.css b/openwrt-packages/luci-theme-kucat/htdocs/luci-static/kucat/css/theme.css deleted file mode 100644 index fbe4b54019..0000000000 --- a/openwrt-packages/luci-theme-kucat/htdocs/luci-static/kucat/css/theme.css +++ /dev/null @@ -1,8 +0,0 @@ - -@supports (-webkit-touch-callout: none) { - body { - -webkit-touch-callout: none; - padding: env(safe-area-inset-top) env(safe-area-inset-right) - env(safe-area-inset-bottom) env(safe-area-inset-left); - } -} \ No newline at end of file diff --git a/openwrt-packages/luci-theme-kucat/htdocs/luci-static/kucat/js/initMode.js b/openwrt-packages/luci-theme-kucat/htdocs/luci-static/kucat/js/initMode.js deleted file mode 100644 index 6d4474b53d..0000000000 --- a/openwrt-packages/luci-theme-kucat/htdocs/luci-static/kucat/js/initMode.js +++ /dev/null @@ -1,87 +0,0 @@ -/* = 18) ? 'dark' : 'light'; - } - -function getSystemTheme() { - return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; -} - -async function updateTheme(theme) { - const root = document.documentElement; - const newTheme = theme === 'dark' ? 'dark' : 'light'; - const isDark = newTheme === 'dark'; - try { - const config = await getUci(); - const primaryRgbbody = isDark ? '33,45,60' : '248,248,248'; - const bgqsValue = config.bgqs || "0"; - const rgbmValue = config.primaryrgbm || '45,102,147'; - const rgbmtsValue = config.primaryrgbmts || '0'; - const meta = document.querySelector('meta[name="theme-color"]'); - if (meta) { - meta.content = isDark ? '#1a1a1a' : '#ffffff'; - } - const vars = bgqsValue === "0" ? { - '--menu-fontcolor': isDark ? '#ddd' : '#f5f5f5', - '--primary-rgbbody': primaryRgbbody, - '--bgqs-image': '-webkit-linear-gradient(135deg, rgba(255, 255, 255, 0.1) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.1) 50%, rgba(255, 255, 255, 0.1) 75%, transparent 75%, transparent)', - '--menu-bgcolor': `rgba(${rgbmValue}, ${rgbmtsValue})`, - '--menu-item-hover-bgcolor': 'rgba(248,248,248, 0.22)', - '--menu-item-active-bgcolor': 'rgba(248,248,248, 0.3)', - } : { - '--menu-fontcolor': isDark ? '#ddd' : '#4d4d5d', - '--primary-rgbbody': primaryRgbbody, - '--menu-bgcolor': `rgba(${primaryRgbbody},${rgbmtsValue})`, - }; - - Object.entries(vars).forEach(([key, value]) => { - root.style.setProperty(key, value); - }); - - if (window.LuciForm) LuciForm.refreshVisibility(); - } catch (error) { - console.error('Error updating theme variables:', error); - } -} -(async function(){ - const config = await getUci(); - var initMode = config.mode; - var autoTheme; - function applyTheme(theme) { - document.body.setAttribute('data-theme', theme); - const meta = document.querySelector('meta[name="theme-color"]'); - if (meta) { - meta.content = theme === 'dark' ? '#1a1a1a' : '#ffffff'; - } - } - - (async function() { - if (initMode === 'auto') { - autoTheme = getTimeTheme(); - } else { - autoTheme = initMode; - } - applyTheme(autoTheme); - await updateTheme(autoTheme); - })(); -})(); -/* ]]> */ diff --git a/openwrt-packages/luci-theme-kucat/htdocs/luci-static/kucat/js/style.js b/openwrt-packages/luci-theme-kucat/htdocs/luci-static/kucat/js/style.js index 9a3ab22fe6..b1c18b23c1 100644 --- a/openwrt-packages/luci-theme-kucat/htdocs/luci-static/kucat/js/style.js +++ b/openwrt-packages/luci-theme-kucat/htdocs/luci-static/kucat/js/style.js @@ -1,6 +1,6 @@ /* * luci-theme-kucat - * Copyright (C) 2019-2024 The Sirpdboy Team + * Copyright (C) 2019-2025 The Sirpdboy Team * * Have a bug? Please create an issue here on GitHub! * https://github.com/sirpdboy/luci-theme-kucat/issues diff --git a/openwrt-packages/luci-theme-kucat/htdocs/luci-static/kucat/js/switcher.js b/openwrt-packages/luci-theme-kucat/htdocs/luci-static/kucat/js/switcher.js deleted file mode 100644 index eb919386d0..0000000000 --- a/openwrt-packages/luci-theme-kucat/htdocs/luci-static/kucat/js/switcher.js +++ /dev/null @@ -1,120 +0,0 @@ -/* = 18) ? 'dark' : 'light'; -} - -// Theme Application -async function updateThemeVariables(theme) { - const root = document.documentElement; - const isDark = theme === 'dark'; - try { - const config = await syncgetUci(); - const primaryRgbbody = isDark ? '33,45,60' : '248,248,248'; - const bgqsValue = config.bgqs || "1"; - const rgbmValue = config.primaryrgbm || '45,102,147'; - const rgbmtsValue = config.primaryrgbmts || '0'; - const vars = bgqsValue === "0" ? { - '--menu-fontcolor': isDark ? '#ddd' : '#f5f5f5', - '--primary-rgbbody': primaryRgbbody, - '--bgqs-image': '-webkit-linear-gradient(135deg, rgba(255, 255, 255, 0.1) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.1) 50%, rgba(255, 255, 255, 0.1) 75%, transparent 75%, transparent)', - '--menu-bgcolor': `rgba(${rgbmValue}, ${rgbmtsValue})`, - '--menu-item-hover-bgcolor': 'rgba(248,248,248, 0.22)', - '--menu-item-active-bgcolor': 'rgba(248,248,248, 0.3)', - } : { - '--menu-fontcolor': isDark ? '#ddd' : '#4d4d5d', - '--primary-rgbbody': primaryRgbbody, - '--menu-bgcolor': `rgba(${primaryRgbbody},${rgbmtsValue})`, - }; - - - Object.entries(vars).forEach(([key, value]) => { - root.style.setProperty(key, value); - }); - - if (window.LuciForm) { - LuciForm.refreshVisibility(); - } - } catch (error) { - console.error('Error updating theme variables:', error); - } -} - -document.getElementById('themeToggle').addEventListener('click', function() { - const switcher = this; - const isDark = switcher.dataset.theme === 'dark'; - const newTheme = isDark ? 'light' : 'dark'; - - switcher.dataset.theme = newTheme; - - document.querySelectorAll('.theme-switcher span').forEach(span => { - span.classList.toggle('active'); - }); - - document.body.setAttribute('data-theme', newTheme); - - // console.debug('switcher:', switcher.dataset.theme,newTheme); - syncToUci(newTheme); - updateThemeVariables(newTheme); -}); - -window.addEventListener('DOMContentLoaded', async function() { - - const config = await syncgetUci(); - - function applyTheme(theme) { - document.body.setAttribute('data-theme', theme); - const meta = document.querySelector('meta[name="theme-color"]'); - const switcher = document.getElementById('themeToggle'); - switcher.dataset.theme = theme; - if (theme === 'dark') { - switcher.querySelector('.pdboy-dark').classList.add('active'); - switcher.querySelector('.pdboy-light').classList.remove('active'); - } else { - switcher.querySelector('.pdboy-light').classList.add('active'); - switcher.querySelector('.pdboy-dark').classList.remove('active'); - } - if (meta) { - meta.content = theme === 'dark' ? '#1a1a1a' : '#ffffff'; - } - } - const themeToApply = config.mode === 'auto' - ? getTimeBasedTheme() - : (config.mode || 'light'); - - - // console.debug('switcher:', config.mode,themeToApply); - applyTheme(themeToApply); - await updateThemeVariables(themeToApply); -}); - -/* ]]> */ diff --git a/openwrt-packages/luci-theme-kucat/htdocs/luci-static/resources/background/README.md b/openwrt-packages/luci-theme-kucat/htdocs/luci-static/resources/background/README.md new file mode 100644 index 0000000000..a86f27b06a --- /dev/null +++ b/openwrt-packages/luci-theme-kucat/htdocs/luci-static/resources/background/README.md @@ -0,0 +1,2 @@ +Drop background here! +accept jpg png gif mp4 webm diff --git a/openwrt-packages/luci-theme-kucat/htdocs/luci-static/resources/menu-kucat.js b/openwrt-packages/luci-theme-kucat/htdocs/luci-static/resources/menu-kucat.js index ac2a213ef6..348462355e 100644 --- a/openwrt-packages/luci-theme-kucat/htdocs/luci-static/resources/menu-kucat.js +++ b/openwrt-packages/luci-theme-kucat/htdocs/luci-static/resources/menu-kucat.js @@ -1,6 +1,6 @@ /* * luci-theme-kucat - * Copyright (C) 2019-2024 The Sirpdboy Team + * Copyright (C) 2019-2025 The Sirpdboy * * Have a bug? Please create an issue here on GitHub! * https://github.com/sirpdboy/luci-theme-kucat/issues diff --git a/openwrt-packages/luci-theme-kucat/luasrc/controller/api.lua b/openwrt-packages/luci-theme-kucat/luasrc/controller/api.lua deleted file mode 100644 index f45dd5c8a8..0000000000 --- a/openwrt-packages/luci-theme-kucat/luasrc/controller/api.lua +++ /dev/null @@ -1,74 +0,0 @@ -module("luci.controller.api", package.seeall) - -http = require "luci.http" -fs = require "nixio.fs" -uci = require "luci.model.uci".cursor() -json = require "luci.jsonc" - -function index() - entry({"api", "get"}, call("get_theme"), nil, 10) - entry({"api", "set"}, call("set_theme"), nil, 20) -end - -function get_theme() - local kucat = nil - local config_exists = false - local bgqs = "1" - local primaryrgbm = "45,102,147" - local primaryrgbmts = "0" - local mode = "auto" - - if fs.access("/etc/config/advancedplus") then - kucat = "advancedplus" - config_exists = true - elseif fs.access("/etc/config/kucat") then - kucat = "kucat" - config_exists = true - end - - if config_exists then - local ku = uci:get_all(kucat, "@basic[0]") or {} - bgqs = ku.bgqs or bgqs - primaryrgbm = ku.primary_rgbm or primaryrgbm - primaryrgbmts = ku.primary_rgbm_ts or primaryrgbmts - mode = ku.mode or mode - end - - http.prepare_content("application/json") - http.write_json({ - success = config_exists, - bgqs = bgqs, - primaryrgbm = primaryrgbm, - primaryrgbmts = primaryrgbmts, - mode = mode - }) -end - -function set_theme() - local kucat = nil - local config_exists = false - local theme = http.formvalue("theme") - if fs.access("/etc/config/advancedplus") then - kucat = 'advancedplus' - config_exists = true - elseif fs.access("/etc/config/kucat") then - kucat = 'kucat' - config_exists = true - end - if (config_exists) then - local esc_kucat = "'" .. kucat:gsub("'", "'\\''") .. "'" - local esc_theme = "'" .. theme:gsub("'", "'\\''") .. "'" - - os.execute(string.format( - "uci set %s.@basic[0].mode=%s && uci commit %s", - kucat, esc_theme, kucat - )) - uci:set(kucat, "@basic[0]", "mode", theme) - uci:commit(kucat) - http.prepare_content("application/json") - http.write_json({ success = true }) - else - http.prepare_content("application/json") - http.write_json({ success = false }) - end -end diff --git a/openwrt-packages/luci-theme-kucat/luasrc/view/themes/kucat/footer.htm b/openwrt-packages/luci-theme-kucat/luasrc/view/themes/kucat/footer.htm deleted file mode 100644 index 7b10507b4d..0000000000 --- a/openwrt-packages/luci-theme-kucat/luasrc/view/themes/kucat/footer.htm +++ /dev/null @@ -1,25 +0,0 @@ - <%# - Copyright (C) 2019-2025 The Sirpdboy Team - - luci-theme-material: - Copyright 2015 Lutty Yang - Licensed to the public under the Apache License 2.0 --%> -<% local ver = require "luci.version" %> - - -
-
- - - - - - - - \ No newline at end of file diff --git a/openwrt-packages/luci-theme-kucat/luasrc/view/themes/kucat/header.htm b/openwrt-packages/luci-theme-kucat/luasrc/view/themes/kucat/header.htm deleted file mode 100644 index 6ab364f3f0..0000000000 --- a/openwrt-packages/luci-theme-kucat/luasrc/view/themes/kucat/header.htm +++ /dev/null @@ -1,346 +0,0 @@ - <%# - Copyright (C) 2019-2025The Sirpdboy Team - luci-theme-material: - Copyright 2015 Lutty Yang - luci-theme-bootstrap: - Copyright 2008 Steven Barth - Copyright 2008 Jo-Philipp Wich - Copyright 2012 David Menting - - MUI: - https://github.com/muicss/mui - - Licensed to the public under the Apache License 2.0 --%> - -<% -local sys = require "luci.sys" -local util = require "luci.util" -local http = require "luci.http" -local disp = require "luci.dispatcher" -local ver = require "luci.version" -local json = require "luci.jsonc" -local fs = require "nixio.fs" -local nutil = require "nixio.util" -local uci = require 'luci.model.uci'.cursor() -local urlencode = luci.http.protocol and luci.http.protocol.urlencode or luci.util.urlencode - -local boardinfo = util.ubus("system", "board") or {} -local node = disp.context.dispatched -local path = table.concat(disp.context.path, "-") -local bar = '/cgi-bin/luci/admin/' -local config_exists = false -local kucat = '' - -function glob(...) - local iter, code, msg = fs.glob(...) - if iter then - return nutil.consume(iter) - end - return nil, code, msg -end - -function getExtension(str) - return urlencode(str:match(".+%.(%w+)$") or "") -end - -http.prepare_content("text/html; charset=UTF-8") - -if fs.access("/etc/config/advancedplus") then - kucat = "advancedplus" - config_exists = true -elseif fs.access("/etc/config/kucat") then - kucat = "kucat" - config_exists = true -end - -local config = {} -local primary_rgbm, primary_rgbm_ts, primary_opacity, primary_rgbs, primary_rgbs_ts, mode -local gohome, gouser, gossr, bgqs, setbar, dayword -local background, bkuse, bklock, fontd, fontz, fontx - -if config_exists then - config = uci:get_all(kucat, "@basic[0]") or {} - primary_rgbm = config.primary_rgbm or '45,102,147' - primary_rgbm_ts = config.primary_rgbm_ts or '0.8' - primary_opacity = config.primary_opacity or '0' - primary_rgbs = config.primary_rgbs or '132,188,218' - primary_rgbs_ts = config.primary_rgbs_ts or '0.1' - mode = config.mode or 'light' - gohome = bar .. "status/" .. (config.gohome or "") - gouser = bar .. "system/" .. (config.gouser or "") - gossr = bar .. "services/" .. (config.gossr or "") - bgqs = config.bgqs or '0' - setbar = config.setbar or '1' - dayword = config.dayword or '0' - background = config.background or '0' - bkuse = config.bkuse or '0' - bklock = config.bklock or '1' - fontd = config.font_d or '1.2rem' - fontz = config.font_z or '0.92rem' - fontx = config.font_x or '0.875rem' -else - primary_rgbm = '45,102,147' - primary_rgbm_ts = '0.8' - primary_opacity = '0' - primary_rgbs = '132,188,218' - primary_rgbs_ts = '0.1' - mode = 'light' - gohome = bar .. "status/" - gouser = bar .. "system/" - gossr = bar .. "services/" - bgqs = '1' - setbar = '1' - dayword = '0' - background = '0' - bkuse = '0' - bklock = '1' - fontd = '1.2rem' - fontz = '0.92rem' - fontx = '0.875rem' -end - -local bk_use = 'background: rgba(var(--primary-rgbbody),1)' -local loginbk_use = 'background: linear-gradient(0deg, rgba(var(--primary-rgbm), 1) 0%, rgba(var(--primary-rgbbody), 1) 100%);display: block;' - - local ufilter = string.format("blur(%dpx)", tonumber(primary_opacity)) - if primary_opacity == '0' then - ufilter = 'none' - end - - local bg_url = media..'/img/bg1.jpg' - local bg_lock = bg_url - if background == '0' then - math.randomseed(os.time()) - - local theme_dir = resource .. '/background/' - if not fs.access('/www' .. resource .. '/background/') then - local theme_dir = media .. '/background/' - end - local bgcount = 0 - local currentBg = {} - local bgs,attr = {} - for i, f in ipairs(glob("/www" .. theme_dir .. "*")) do - attr = fs.stat(f) - if attr then - local ext = getExtension(fs.basename(f)) - if ext == "jfif" or ext == "pjp" or ext == "pjpeg" or ext == "jpeg" or ext == "jpg" or ext == "png" or ext == "gif" then - local bg = {} - bg.type = ext - bg.url = theme_dir .. fs.basename(f) - table.insert(bgs,bg) - bgcount = bgcount + 1 - end - end - end - if bgcount > 0 then - currentBg = bgs[math.random(1,bgcount)] - picurl = currentBg.url - end - else - picurl = sys.exec("/usr/libexec/kucat/kucat_wallpaper") - end - if (picurl and picurl ~= '') then - bg_url = picurl - end - if bklock == '0' then - math.randomseed(os.time()) - local bk_dir = media .. "/bg/" - local bkcount = 0 - local currentbk = {} - local bgs,attr = {} - for i, f in ipairs(glob("/www" .. bk_dir .. "*")) do - attr = fs.stat(f) - if attr then - local ext = getExtension(fs.basename(f)) - if ext == "jfif" or ext == "pjp" or ext == "pjpeg" or ext == "jpeg" or ext == "jpg" or ext == "png" or ext == "gif" then - local bg = {} - bg.type = ext - bg.url = bk_dir .. fs.basename(f) - table.insert(bgs,bg) - bkcount = bkcount + 1 - end - end - end - if bkcount > 0 then - currentbk = bgs[math.random(1,bkcount)] - bg_lock = currentbk.url - end - end - if dayword == '1' then - showword = sys.exec("/usr/libexec/kucat/kucat_word") - end - if bkuse == '1' then - if bklock == '0' then - bk_use = "background-image:url(" .. bg_lock .. ")" - loginbk_use = "background-image:url(" .. bg_url .. ")" - else - bk_use="background-image:url("..bg_url..")" - loginbk_use = "background-image:url(" .. bg_url .. ")" - end - else - if bklock == '0' then - loginbk_use = "background-image:url(" .. bg_url .. ")" - end - end --%> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI - - - - - - - - - <% if node and node.css then %> - - <% end -%> - - - - - - -node-<%= path %><% else %>node-main-login<% end %>" data-page="<%= pcdata(path) %>" style="<%=bk_use%>; " - <% if mode ~= 'auto' then %> - data-theme = "<%= mode %>" - <% end -%> -> -
- -
- -
-
-
-
-
- -
-
-
-
-
- - <%=striptags(boardinfo.hostname or "OpenWrt")%> - <% if dayword == '1' then %> - <%=showword%> - <% end -%> -
-
-
- - -
- - " title="<%:Log_out%>" > -
-
-
- -
- -
-
- <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%> -
-

<%:No password set!%>

-

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

- <% if disp.lookup("admin/system/admin") then %> - - <% end %> -
- - <%- end -%> - - diff --git a/openwrt-packages/luci-theme-kucat/root/etc/uci-defaults/30_luci-kuacat b/openwrt-packages/luci-theme-kucat/root/etc/uci-defaults/30_luci-kuacat index 9edc04921c..4d44a3fa58 100644 --- a/openwrt-packages/luci-theme-kucat/root/etc/uci-defaults/30_luci-kuacat +++ b/openwrt-packages/luci-theme-kucat/root/etc/uci-defaults/30_luci-kuacat @@ -7,7 +7,6 @@ uci batch <<-EOF commit luci EOF fi -chmod +x /usr/libexec/kucat/kucat* rm -rf /tmp/luci-* exit 0 diff --git a/openwrt-packages/luci-theme-kucat/root/usr/libexec/kucat/kucat_wallpaper b/openwrt-packages/luci-theme-kucat/root/usr/libexec/kucat/kucat_wallpaper deleted file mode 100644 index 00b60b9962..0000000000 --- a/openwrt-packages/luci-theme-kucat/root/usr/libexec/kucat/kucat_wallpaper +++ /dev/null @@ -1,99 +0,0 @@ -#!/bin/sh - -# luci-theme-kucat -# Copyright (C) 2019-2025 The Sirpdboy Team -# -# Have a bug? Please create an issue here on GitHub! -# https://github.com/sirpdboy/luci-theme-kucat/issues -# -# Licensed to the public under the Apache License 2.0 - -# author github@sirpdboy - -kucat='kucat' -[ -s "/etc/config/advancedplus" ] &&kucat='advancedplus' -background="$(uci -q get $kucat.@basic[0].background || echo '0')" -KUCATTMP="/var/kucat_date_${background}.tmp" -BGURL="/www/luci-static/kucat/img/down${background}.jpg" -REBGURL="/luci-static/kucat/img/down${background}.jpg" -DFBGURL="/luci-static/kucat/img/bg1.jpg" -WRLOCK="/var/lock/kucat_lock_${background}.lock" - -test_url() { - url=$1 - local status=$(/usr/bin/curl -I -o /dev/null -skL --connect-timeout 1 --retry 1 -w %{http_code} "$url") - case "$status" in - 204|\ - 200) - echo '1' - ;; - esac -} - -curl_bgurl() { - case "$background" in - 1) - local ppath=`curl -s 'https://open.iciba.com/dsapi/' | jsonfilter -qe '@.picture4'` - [ -n "${ppath}" ] && echo "$ppath" - ;; - 2) - curl -fks --max-time 3 \ - --header "Authorization: Client-ID kmFIroj2ELqXJPtC0XUoyww-Tr_lDU8Ho8uxjptIrCo" \ - "https://api.unsplash.com/photos/random?count=1&orientation=landscape" | - jsonfilter -e "@[0]['urls']['regular']" - ;; - 3) - local ppath=`curl -s "https://www.bing.com/HPImageArchive.aspx?format=js&n=1" |jsonfilter -qe '@.images[0].url'` - [ -n "${ppath}" ] && echo "https://www.bing.com${ppath}" - ;; - 4) - local i=`awk 'BEGIN{srand();print int(rand()*8)}'` - local j=`awk 'BEGIN{srand();print int(rand()*200)}'` - local ppath=`curl -s "http://wp.birdpaper.com.cn/intf/search?content=4k&pageno=$j&count=9" | awk -F '\"count\":9' '{print $2}' | awk -F ',\"processTime\"' '{print $1}' | sed 's#,#{#' | jsonfilter -e "@.list[$i].url"` - [ -n "${ppath}" ] && echo "$ppath" - ;; - 5) - curl -fks --max-time 3 \ - "https://wallhaven.cc/api/v1/search?resolutions=1920x1080&sorting=random" | - jsonfilter -qe '@.data[0].path' - ;; - - esac -} - -bgurl_down() { - local lock="$WRLOCK" - exec 200>$lock - if flock -n 200 >/dev/null 2>&1; then - local bgurl="$(curl_bgurl)" - if [ -n "$bgurl" ]; then - rm -rf $BGURL - curl -kLfsm 3 $bgurl -o $BGURL - date +%Y%m%d > $KUCATTMP - fi - - flock -u 200 >/dev/null 2>&1 - fi - [ -s "$BGURL" ] && echo -ne $REBGURL || echo -ne $DFBGURL -} - -check_url() { - if [ -s $KUCATTMP ]; then - localtime=`cat $KUCATTMP | grep $(date +%Y%m%d) ` - if [ $localtime ]; then - if [ -s $BGURL ] ; then - echo -ne $REBGURL - return - fi - fi - fi -# local checknet=$(test_url "https://www.baidu.com") -checknet=`ping -c 1 -W 1 223.5.5.5 > /dev/null 2>&1 &&echo 1 || echo 2` -if [ "x$checknet" == "x1" ]; then - bgurl_down -else - [ -s "$DFBGURL" ] && echo -ne $DFBGURL -fi -} - -check_url \ No newline at end of file diff --git a/openwrt-packages/luci-theme-kucat/root/usr/libexec/kucat/kucat_word b/openwrt-packages/luci-theme-kucat/root/usr/libexec/kucat/kucat_word deleted file mode 100644 index 61b3635e36..0000000000 --- a/openwrt-packages/luci-theme-kucat/root/usr/libexec/kucat/kucat_word +++ /dev/null @@ -1,96 +0,0 @@ -#!/bin/sh - - -# luci-theme-kucat -# Copyright (C) 2019-2024 The Sirpdboy Team -# -# Have a bug? Please create an issue here on GitHub! -# https://github.com/sirpdboy/luci-theme-kucat/issues -# -# Licensed to the public under the Apache License 2.0 -LANG=`uci get luci.main.lang` -WORDDATETMP="/var/dayword_kucatword_date.tmp" -LOCK="/var/lock/dayword_kucatword.lock" -WORDTMP="/var/dayword_kucatword_$LANG.tmp" -test_url() { - url=$1 - status="$(/usr/bin/curl -I -o /dev/null -skL --connect-timeout 1 --retry 1 -w %{http_code} "$url")" - case "$status" in - 204|\ - 200) - echo '1' - ;; - esac -} - -get_word() { - kucat='kucat' - [ -s "/etc/config/advancedplus" ] &&kucat='advancedplus' - dayword="$(uci -q get $kucat.@basic[0].dayword || echo '0')" - case "$dayword" in - 1) - [ "X$LANG" == "Xen" ] && gwordjson=`curl -s 'https://open.iciba.com/dsapi/' | jsonfilter -qe '@.content'` || gwordjson=`curl -s 'https://open.iciba.com/dsapi/' | jsonfilter -qe '@.note'` - [ -n "${gwordjson}" ] && echo "$gwordjson" - ;; - 2) - # form iciba : https://api.vvhan.com/api/en - [ "X$LANG" == "Xen" ] && gwordjson=`curl -s 'https://api.vvhan.com/api/en?type=sj'| jsonfilter -qe '@.data.zh'` || gwordjson=`curl -s 'https://api.vvhan.com/api/en?type=sj'| jsonfilter -qe '@.data.en'` - [ -n "${gwordjson}" ] && echo "$gwordjson" - ;; - 3) - local gwordjson=`curl -s 'https://api.yixiangzhilv.com/yiyan/sentence/get/'` - local gword=`echo $gwordjson | jsonfilter -qe '@.content'` - local gfrom=`echo $gwordjson | jsonfilter -qe '@.author'` - [ -n "${gfrom}" ] && gfrom=$(echo " ---- $gfrom")|| gfrom='' - [ -n "${gword}" ] && echo "$gword $gfrom" - ;; - 4) - local gwordjson=`curl -s 'https://yijuzhan.com/api/word.php?m=json'` - local gword=`echo $gwordjson | jsonfilter -qe '@.content'` - local gfrom=`echo $gwordjson | jsonfilter -qe '@.source'` - [ -n "${gfrom}" ] && gfrom=$(echo " ---- $gfrom")|| gfrom='' - [ -n "${gword}" ] && echo "$gword $gfrom" - ;; - 5) - local gword=`curl -s https://v.api.aa1.cn/api/api-wenan-dujitang/index.php?aa1=json | sed 's/\[//g' | sed 's/\]//g'| jsonfilter -qe '@.dujitang'` - [ -n "${gword}" ] && echo "$gword" - ;; - - *) - local gwordjson=`curl -s 'https://v1.hitokoto.cn'` - local gword=`echo $gwordjson | jsonfilter -qe '@.hitokoto'` - local gfrom=`echo $gwordjson | jsonfilter -qe '@.from_who'` - [ -n "${gfrom}" ] && gfrom=$(echo " ---- $gfrom")|| gfrom='' - [ -n "${gword}" ] && echo "$gword $gfrom" - ;; - esac -} - -kucatword() { - lock="$LOCK" - exec 200>"$lock" - if flock -n 200 >"/dev/null" 2>&1; then - local localword="$(get_word)" - if [ -n "$localword" ]; then - echo "$localword" >$WORDTMP - date +%Y%m%d > $WORDDATETMP - fi - flock -u 200 >"/dev/null" 2>&1 - fi - [ -s "$WORDTMP" ] && cat $WORDTMP || echo -ne "Acquisition failed ,Please Issues:github@sirpdboy" -} -check_url() { -if [ -f "$WORDDATETMP" ]; then - localtime=`cat $WORDDATETMP | grep $(date +%Y%m%d) ` - if [ $localtime ]; then - [ -s "$WORDTMP" ] && cat $WORDTMP && return - fi - fi -local checknet=`ping -c 1 -W 1 223.5.5.5 > /dev/null 2>&1 &&echo 1 || echo 2` -if [ "x$checknet" == "x1" ]; then - kucatword -else - echo -ne "No internet connection, no information." -fi -} -check_url \ No newline at end of file diff --git a/openwrt-packages/luci-theme-kucat/root/usr/libexec/rpcd/luci.kucat b/openwrt-packages/luci-theme-kucat/root/usr/libexec/rpcd/luci.kucat new file mode 100644 index 0000000000..899bed6fab --- /dev/null +++ b/openwrt-packages/luci-theme-kucat/root/usr/libexec/rpcd/luci.kucat @@ -0,0 +1,313 @@ +#!/bin/sh + +# author github@sirpdboy + +# luci-theme-kucat +# Copyright (C) 2019-2025 The Sirpdboy Team +# +# Have a bug? Please create an issue here on GitHub! +# https://github.com/sirpdboy/luci-theme-kucat/issues +# +# Licensed to the public under the Apache License 2.0 + +. /lib/functions.sh +. /usr/share/libubox/jshn.sh + +kucat='kucat' +[ -s "/etc/config/advancedplus" ] && kucat='advancedplus' +background="$(uci -q get $kucat.@basic[0].background || echo '0')" +PIC_CACHE="/var/kucat_pic_${background}.cache" +PIC_PATH="/www/luci-static/kucat/img/down${background}.jpg" +PIC_RE_URL="/luci-static/kucat/img/down${background}.jpg" +PIC_DF_URL="/luci-static/kucat/img/bg1.jpg" +PIC_LOCK="/var/lock/kucat_lock_pic.lock" +LANG=$(uci get luci.main.lang 2>/dev/null || echo "zh_cn") +WORD_CACHE="/var/kucat_daily_word_$LANG.cache" +WORD_LOCK="/var/lock/kucat_daily_word.lock" + +# 获取每日一言 +fetch_daily_word() { + + dayword="$(uci -q get $kucat.@basic[0].dayword || echo '0')" + case "$dayword" in + 1) + [ "X$LANG" == "Xen" ] && gwordjson=$(curl -s 'https://open.iciba.com/dsapi/' | jsonfilter -qe '@.content') || gwordjson=$(curl -s 'https://open.iciba.com/dsapi/' | jsonfilter -qe '@.note') + [ -n "${gwordjson}" ] && echo "$gwordjson" + ;; + 2) + # form iciba : https://api.vvhan.com/api/en + [ "X$LANG" == "Xen" ] && gwordjson=$(curl -s 'https://api.vvhan.com/api/en?type=sj' | jsonfilter -qe '@.data.zh') || gwordjson=$(curl -s 'https://api.vvhan.com/api/en?type=sj' | jsonfilter -qe '@.data.en') + [ -n "${gwordjson}" ] && echo "$gwordjson" + ;; + 3) + local gwordjson=$(curl -s 'https://api.yixiangzhilv.com/yiyan/sentence/get/') + local gword=$(echo $gwordjson | jsonfilter -qe '@.content') + local gfrom=$(echo $gwordjson | jsonfilter -qe '@.author') + [ -n "${gfrom}" ] && gfrom=$(echo "$gfrom") || gfrom='' + [ -n "${gword}" ] && echo "$gword $gfrom" + ;; + 4) + local gwordjson=$(curl -s 'https://yijuzhan.com/api/word.php?m=json') + local gword=$(echo $gwordjson | jsonfilter -qe '@.content') + local gfrom=$(echo $gwordjson | jsonfilter -qe '@.source') + [ -n "${gfrom}" ] && gfrom=$(echo "$gfrom") || gfrom='' + [ -n "${gword}" ] && echo "$gword $gfrom" + ;; + 5) + local gword=$(curl -s https://v.api.aa1.cn/api/api-wenan-dujitang/index.php?aa1=json | sed 's/\[//g' | sed 's/\]//g' | jsonfilter -qe '@.dujitang') + [ -n "${gword}" ] && echo "$gword" + ;; + *) + local gwordjson=$(curl -s 'https://v1.hitokoto.cn') + local gword=$(echo $gwordjson | jsonfilter -qe '@.hitokoto') + local gfrom=$(echo $gwordjson | jsonfilter -qe '@.from_who') + [ -n "${gfrom}" ] && gfrom=$(echo "$gfrom") || gfrom='' + [ -n "${gword}" ] && echo "$gword $gfrom" + ;; + esac +} + +check_network_curl() { + # 尝试访问知名网站,超时3秒 + if curl -s --connect-timeout 3 -I "https://www.qq.com" > /dev/null 2>&1; then + echo 1 + else + echo 2 + fi +} +check_network_wget() { + # 尝试下载小文件,超时3秒 + if wget -T 3 -q --spider "https://www.qq.com" > /dev/null 2>&1; then + echo 1 + else + echo 2 + fi +} +check_network() { + # 检查DNS解析 + if ! nslookup "www.qq.com" > /dev/null 2>&1; then + echo 2 + return + fi + + # 检查HTTP连接 + if curl -s --connect-timeout 3 "https://www.qq.com" > /dev/null 2>&1; then + echo 1 + else + echo 2 + fi +} + +try_update_word() { + local lock="$WORD_LOCK" + exec 200>"$lock" + + if flock -n 200 >"/dev/null" 2>&1; then + local tword="$(fetch_daily_word)" + if [ -n "$tword" ]; then + echo "$tword" >"$WORD_CACHE" && date +%Y%m%d >> "$WORD_CACHE" + else + if [ -s "$WORD_CACHE" ]; then + cat "$WORD_CACHE" | head -n1 + else + if [ "$LANG" = "en" ]; then + echo "Enjoy the quiet moments of today." + else + echo "今日无感,静享时光。" + fi + fi + fi + flock -u 200 >"/dev/null" 2>&1 + elif [ -s "$WORD_CACHE" ]; then + cat "$WORD_CACHE" | head -n1 + fi +} + +fetch_PicUrl() { + local picurl + case "$background" in + 1) + picurl=$(curl -s 'https://open.iciba.com/dsapi/' |\ + jsonfilter -qe '@.picture4') + [ -n "${picurl}" ] && echo "$picurl" + ;; + 2) + curl -fks --max-time 3 \ + --header "Authorization: Client-ID kmFIroj2ELqXJPtC0XUoyww-Tr_lDU8Ho8uxjptIrCo" \ + "https://api.unsplash.com/photos/random?count=1&orientation=landscape" | + jsonfilter -e "@[0]['urls']['regular']" + ;; + 3) + picurl=$(curl -s "https://www.bing.com/HPImageArchive.aspx?format=js&n=1" |\ + jsonfilter -qe '@.images[0].url') + [ -n "${picurl}" ] && echo "https://www.bing.com${picurl}" + ;; + 4) + i=$(awk 'BEGIN{srand();print int(rand()*8)}') + j=$(awk 'BEGIN{srand();print int(rand()*200)}') + curl -s "http://wp.birdpaper.com.cn/intf/search?content=4k&pageno=$j&count=9" | + awk -F '\"count\":9' '{print $2}' | awk -F ',\"processTime\"' '{print $1}' | + sed 's#,#{#' | + jsonfilter -e "@.list[$i].url" + ;; + 5) + curl -fks --max-time 3 \ + "https://wallhaven.cc/api/v1/search?resolutions=1920x1080&sorting=random" | + jsonfilter -qe '@.data[0].path' + ;; + esac +} + +try_down_pic() { + local lock="$PIC_LOCK" + exec 200>$lock + if flock -n 200 >/dev/null 2>&1; then + local bgurl="$(fetch_PicUrl)" + if [ -n "$bgurl" ]; then + rm -rf "$PIC_PATH" + curl -kLfsm 3 "$bgurl" -o "$PIC_PATH" > /dev/null 2>&1 + date +%Y%m%d > "$PIC_CACHE" + fi + flock -u 200 >/dev/null 2>&1 + fi + [ -s "$PIC_PATH" ] && echo -ne $PIC_RE_URL || echo -ne $PIC_DF_URL +} + +case "$1" in +"list") + json_init + json_add_object "get_url" + json_close_object + json_add_object "get_word" + json_close_object + json_add_object "get_config" + json_close_object + json_add_object "set_config" + json_close_object + json_add_object "get_auto_theme" + json_close_object + json_dump + json_cleanup + ;; +"call") + case "$2" in + "get_config") + read -r input + mode="$(uci -q get $kucat.@basic[0].mode || echo 'light')" + automode="$(uci -q get $kucat.@basic[0].automode || echo 'light')" + + json_init + json_add_string "mode" "$mode" + json_add_string "automode" "$automode" + json_add_boolean "success" 1 + json_dump + json_cleanup + ;; + + "set_config") + read -r input + json_load "$input" 2>/dev/null + + json_get_var new_mode "mode" + json_get_var new_automode "automode" + if [ -n "$new_mode" ]; then + case "$new_mode" in + "light"|"dark"|"auto") + uci set $kucat.@basic[0].mode="$new_mode" + ;; + esac + fi + + # 设置自动模式 + if [ -n "$new_automode" ]; then + case "$new_automode" in + "light"|"dark") + uci set $kucat.@basic[0].automode="$new_automode" + ;; + esac + fi + + uci commit $kucat + + json_init + json_add_boolean "success" 1 + json_dump + json_cleanup + ;; + + "get_auto_theme") + read -r input + hour=$(date +%H) + if [ $hour -ge 6 ] && [ $hour -lt 18 ]; then + auto_theme="light" + else + auto_theme="dark" + fi + + json_init + json_add_string "auto_theme" "$auto_theme" + json_add_boolean "success" 1 + json_dump + json_cleanup + ;; + "get_url") + read -r input + if [ -s "$PIC_CACHE" ]; then + pictime=$(cat $PIC_CACHE | grep $(date +%Y%m%d)) + if [ -n "$pictime" ]; then + json_init + json_add_string "url" "$PIC_RE_URL" + json_add_boolean "success" 1 + json_dump + json_cleanup + return 0 + + fi + fi + + if check_network; then + final_url="$(try_down_pic)" + else + final_url=$PIC_DF_URL + fi + + json_init + json_add_string "url" "$final_url" + json_add_boolean "success" 1 + json_dump + json_cleanup + + ;; + "get_word") + read -r input + if [ -s "$WORD_CACHE" ]; then + wordtime=$(cat $WORD_CACHE | grep $(date +%Y%m%d)) + if [ -n "$wordtime" ]; then + json_init + json_add_string "word" "$(cat "$WORD_CACHE" | head -n1)" + json_add_boolean "success" 1 + json_dump + json_cleanup + return 0 + + fi + fi + if check_network; then + word_content="$(try_update_word)" + else + if [ "x$LANG" = "xen" ]; then + word_content="Enjoy the quiet moments of today." + else + word_content="今日无感,静享时光。" + fi + fi + + json_init + json_add_string "word" "$word_content" + json_add_boolean "success" 1 + json_dump + json_cleanup + ;; + esac + ;; +esac diff --git a/openwrt-packages/luci-theme-kucat/root/usr/share/rpcd/acl.d/luci-theme-kucat.json b/openwrt-packages/luci-theme-kucat/root/usr/share/rpcd/acl.d/luci-theme-kucat.json new file mode 100644 index 0000000000..4a6f744c0f --- /dev/null +++ b/openwrt-packages/luci-theme-kucat/root/usr/share/rpcd/acl.d/luci-theme-kucat.json @@ -0,0 +1,28 @@ +{ + "luci-theme-kucat": { + "description": "Grant UCI access for luci-theme-kucat", + "read": { + "uci": [ "kucat" ], + "file": { + "/www/luci-static/kucat/img/": [ "read" ], + "/www/luci-static/kucat/background/": [ "read" ], + "/www/luci-static/resources/background/": [ "read" ], + "/www/luci-static/kucat/": [ "list", "read" ] + }, + "ubus": { + "luci.kucat": [ "*" ] + } + }, + "write": { + "ubus": { + "luci.kucat": [ "*" ] + }, + "file": { + "/www/luci-static/kucat/img/": [ "write" ], + "/www/luci-static/kucat/background/": [ "write" ], + "/www/luci-static/resources/background/": [ "write" ] + }, + "uci": ["kucat"] + } + } +} diff --git a/openwrt-packages/luci-theme-kucat/ucode/template/themes/kucat/footer.ut b/openwrt-packages/luci-theme-kucat/ucode/template/themes/kucat/footer.ut new file mode 100644 index 0000000000..635b443d44 --- /dev/null +++ b/openwrt-packages/luci-theme-kucat/ucode/template/themes/kucat/footer.ut @@ -0,0 +1,38 @@ +{# + luci-theme-kucat: + Copyright (C) 2019-2025 The Sirpdboy + Have a bug? Please create an issue here on GitHub! + https://github.com/sirpdboy/luci-theme-kucat/issues + + luci-theme-material: + Copyright 2015 Lutty Yang + luci-theme-bootstrap: + Copyright 2008 Steven Barth + Copyright 2008 Jo-Philipp Wich + Copyright 2012 David Menting + + MUI: + https://github.com/muicss/mui + + Licensed to the public under the Apache License 2.0 + +-#} + + +
+ +
+
+ + + + \ No newline at end of file diff --git a/openwrt-packages/luci-theme-kucat/ucode/template/themes/kucat/header.ut b/openwrt-packages/luci-theme-kucat/ucode/template/themes/kucat/header.ut new file mode 100644 index 0000000000..208ba408a8 --- /dev/null +++ b/openwrt-packages/luci-theme-kucat/ucode/template/themes/kucat/header.ut @@ -0,0 +1,324 @@ +{# + luci-theme-kucat: + Copyright (C) 2019-2025 The Sirpdboy + Have a bug? Please create an issue here on GitHub! + https://github.com/sirpdboy/luci-theme-kucat/issues + + luci-theme-material: + Copyright 2015 Lutty Yang + luci-theme-bootstrap: + Copyright 2008 Steven Barth + Copyright 2008 Jo-Philipp Wich + Copyright 2012 David Menting + + MUI: + https://github.com/muicss/mui + + Licensed to the public under the Apache License 2.0 + +-#} +{% +import { cursor } from 'uci'; +import { readfile, access, lsdir } from 'fs'; +import { srand } from 'math'; +import { getuid, getspnam } from 'luci.core'; +const boardinfo = ubus.call('system', 'board'); +const hostname = striptags(boardinfo?.hostname ?? '?'); +let uci_cursor = cursor(); +http.prepare_content('text/html; charset=UTF-8'); +srand(+substr(reverse(time() + ""), 0, 8)); + +//Custom settings +let config = {}; +let bar = '/cgi-bin/luci/admin/'; +let config_exists = false; +let kucat = ''; +let showword = ""; + +let primary_rgbm = '45,102,147', primary_rgbbody = '244,245,247',primary_rgbm_ts = '0.8', primary_opacity = '0', primary_rgbs = '132,188,218', primary_rgbs_ts = '0.1', mode = 'light'; +let gohome = bar + "status/", gouser = bar + "system/", gossr = bar + "services/", bgqs = '1', setbar = '1', dayword = '0'; +let background = '0', bkuse = '0', bklock = '1', fontd = '1.2rem', fontz = '0.92rem', fontx = '0.875rem'; +let bg_url = media + "/img/bg1.jpg"; +const dark_css = readfile('/www/luci-static/kucat/css/dark.css'); + +if (access('/etc/config/advancedplus')) { + kucat = "advancedplus"; + config_exists = true; +} else if (access('/etc/config/kucat')) { + kucat = "kucat"; + config_exists = true; +} + +if (config_exists) { + let config = uci_cursor.get_all(kucat, "@basic[0]"); + primary_rgbm = config.primary_rgbm || "45,102,147"; + primary_rgbbody= config.primary_rgbbody || "244,245,247"; + primary_rgbm_ts = config.primary_rgbm_ts || "0.8"; + primary_opacity = config.primary_opacity || '0'; + primary_rgbs = config.primary_rgbs || "132,188,218"; + primary_rgbs_ts = config.primary_rgbs_ts || "0.1"; + mode = config.mode || "light"; + gohome = bar + "status/" + config.gohome|| "overview"; + gouser = bar + "system/" + config.gouser|| "system"; + gossr = bar + "services/" + config.gossr || "shadowsocksr"; + bgqs = config.bgqs || "1"; + setbar = config.setbar || "1"; + dayword = config.dayword || "0"; + background = config.background || "0"; + bkuse = config.bkuse || "0"; + bklock = config.bklock || "1"; + fontd = config.font_d || '1.2rem'; + fontz = config.font_z || '0.92rem'; + fontx = config.font_x || '0.875rem'; +} +let ufilter = "blur(" + primary_opacity + "px)"; +if (primary_opacity == '0') { + ufilter = 'none'; +} + +let automode = mode; +if ( mode == 'auto' ) { + let auto_theme = ubus.call("luci.kucat", "get_auto_theme") || {}; + automode = 'dark'; +} + +function fetchPIC(path, themeDir) { + const imageTypes = " jpg jpeg png gif webp "; + let backgroundTable = []; + + let files = lsdir(path) || []; + for (let i = 0; i < length(files); i++) { + let f = files[i]; + let parts = split(f, '.'); + if (length(parts) > 1) { + let ext = lc(parts[1]); + if (ext && index(imageTypes, " " + ext + " ") != -1) { + let bg = { + type: ext, + url: themeDir + f + }; + push(backgroundTable, bg); + } + } + } + return backgroundTable; +} + +function Getwallpaper(themeDir, num) { + let bgUrl = media + '/img/bg1.jpg'; + if ( num == '0' ) { + let physicalPath = "/www" + themeDir; + if (!access(physicalPath)) { return { url: bgUrl };} + let bgpath = fetchPIC(physicalPath, themeDir); + if (length(bgpath) > 0) { + let randomIndex = rand() % length(bgpath); + let currentBg = bgpath[randomIndex]; + bgUrl = currentBg.url; + } + } else { + + const picurl = ubus.call("luci.kucat", "get_url") ?? {}; + if (picurl && picurl.url) { + return { url: picurl.url }; + } + } + return { url: bgUrl }; + +} +let bg_url_result = Getwallpaper(resource + "/background/", background); +let bg_url = bg_url_result.url; +let bg_lock = bg_url; + + +let bk_use = "background: rgba(var(--primary-rgbbody),1)"; +let loginbk_use = "background: linear-gradient(0deg, rgba(var(--primary-rgbm), 1) 0%, rgba(var(--primary-rgbbody), 1) 100%); display: block;"; + +if (bkuse == "1") { + if (bklock == "0") { + let bg_lock_result = Getwallpaper(media + "/background/", '0'); + bg_lock = bg_lock_result.url; + bk_use = "background-image: url(" + bg_lock + ")"; + loginbk_use = "background-image: url(" + bg_url + ")"; + } else { + bk_use = "background-image: url(" + bg_url + ")"; + loginbk_use = "background-image: url(" + bg_url + ")"; + } +} else { + if (bklock == "0") { + loginbk_use = "background-image: url(" + bg_url + ")"; + } +} + +if (dayword == "1") { + let tmpshowword = ubus.call("luci.kucat", "get_word") || {}; + if (tmpshowword && tmpshowword.word) { + showword = tmpshowword.word; + } + +} + +%} + + + + + + {{ hostname }}{{ node?.title ? ` - ${striptags(node.title)}` : '' }} - LuCI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
+ +
+
+ +
+
+
+ + +
+
+
+
+
+
+ + {{ hostname }} + {% if (dayword == '1'): %} + {{ showword }} + {% endif %} +
+
+ + +
+
+
+ +
+ + +
+
+ {% if (getuid() == 0 && getspnam('root')?.pwdp === '' && ctx.authsession): %} +
+

{{ _('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 %} + + {% if (boardinfo?.rootfs_type == "initramfs"): %} +
+

{{ _('System running in recovery (initramfs) mode.') }}

+

{{ _('No changes to settings will be stored and are lost after rebooting. This mode should only be used to install a firmware upgrade') }}

+ {% if (dispatcher.lookup("admin/system/flash")): %} + + {% endif %} +
+ {% endif %} + + + + diff --git a/openwrt-packages/openlist2/Makefile b/openwrt-packages/openlist2/Makefile index 765ca0ff26..d74dc3f99a 100644 --- a/openwrt-packages/openlist2/Makefile +++ b/openwrt-packages/openlist2/Makefile @@ -7,13 +7,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=openlist2 -PKG_VERSION:=4.1.6 -PKG_WEB_VERSION:=4.1.6 +PKG_VERSION:=4.1.7 +PKG_WEB_VERSION:=4.1.7 PKG_RELEASE:=1 PKG_SOURCE:=openlist-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/OpenListTeam/OpenList/tar.gz/v$(PKG_VERSION)? -PKG_HASH:=9cb26d5a41a9df56a6c937bc37a572ff104e2d5a72c0ec8813273f2e67c0a092 +PKG_HASH:=f1b92628be09ba181decc46423c3e0624b78aedfcd28590990a46ba03d75e5e4 PKG_BUILD_DIR:=$(BUILD_DIR)/OpenList-$(PKG_VERSION) @@ -24,7 +24,7 @@ PKG_MAINTAINER:=sbwml define Download/openlist-frontend FILE:=openlist-frontend-dist-lite-v$(PKG_WEB_VERSION).tar.gz URL:=https://github.com/OpenListTeam/OpenList-Frontend/releases/download/v$(PKG_WEB_VERSION)/ - HASH:=b57cfeabd160664478086a952d618f1b5ac022852909d38d7a31924b27067308 + HASH:=2a365c1ce17904926cf275540680f0f24c0c8c3620fcbb98149d7faf781235aa endef PKG_BUILD_DEPENDS:=golang/host diff --git a/openwrt-passwall/luci-app-passwall/luasrc/controller/passwall.lua b/openwrt-passwall/luci-app-passwall/luasrc/controller/passwall.lua index d8161351b7..267f8be6db 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/controller/passwall.lua +++ b/openwrt-passwall/luci-app-passwall/luasrc/controller/passwall.lua @@ -88,6 +88,7 @@ function index() entry({"admin", "services", appname, "subscribe_del_all"}, call("subscribe_del_all")).leaf = true entry({"admin", "services", appname, "subscribe_manual"}, call("subscribe_manual")).leaf = true entry({"admin", "services", appname, "subscribe_manual_all"}, call("subscribe_manual_all")).leaf = true + entry({"admin", "services", appname, "flush_set"}, call("flush_set")).leaf = true --[[rule_list]] entry({"admin", "services", appname, "read_rulelist"}, call("read_rulelist")).leaf = true @@ -868,3 +869,17 @@ function subscribe_manual_all() luci.sys.call("lua /usr/share/" .. appname .. "/subscribe.lua start all manual >/dev/null 2>&1 &") http_write_json({ success = true, msg = "Subscribe triggered." }) end + +function flush_set() + local redirect = http.formvalue("redirect") or "0" + local reload = http.formvalue("reload") or "0" + if reload == "1" then + uci:set(appname, '@global[0]', "flush_set", "1") + api.uci_save(uci, appname, true, true) + else + api.sh_uci_set(appname, "@global[0]", "flush_set", "1", true) + end + if redirect == "1" then + http.redirect(api.url("log")) + end +end diff --git a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua index bcb8b47a7f..e90aa06189 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua +++ b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua @@ -580,16 +580,19 @@ o = s:taboption("DNS", Flag, "dns_redirect", translate("DNS Redirect"), translat o.default = "1" o.rmempty = false -if (m:get("@global_forwarding[0]", "use_nft") or "0") == "1" then - o = s:taboption("DNS", Button, "clear_ipset", translate("Clear NFTSET"), translate("Try this feature if the rule modification does not take effect.")) -else - o = s:taboption("DNS", Button, "clear_ipset", translate("Clear IPSET"), translate("Try this feature if the rule modification does not take effect.")) -end -o.inputstyle = "remove" -function o.write(e, e) - m:set("@global[0]", "flush_set", "1") - api.uci_save(m.uci, appname, true, true) - luci.http.redirect(api.url("log")) +local use_nft = m:get("@global_forwarding[0]", "use_nft") == "1" +local set_title = api.i18n.translate(use_nft and "Clear NFTSET on Reboot" or "Clear IPSET on Reboot") +o = s:taboption("DNS", Flag, "flush_set_on_reboot", set_title, translate("Clear IPSET/NFTSET on service reboot. This may increase reboot time.")) +o.default = "0" +o.rmempty = false + +set_title = api.i18n.translate(use_nft and "Clear NFTSET" or "Clear IPSET") +o = s:taboption("DNS", DummyValue, "clear_ipset", set_title, translate("Try this feature if the rule modification does not take effect.")) +o.rawhtml = true +function o.cfgvalue(self, section) + return string.format( + [[]], + api.url("flush_set") .. "?redirect=1&reload=1", set_title) end s:tab("Proxy", translate("Mode")) diff --git a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe.lua b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe.lua index e7157ec38d..6a60587418 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe.lua +++ b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe.lua @@ -175,19 +175,33 @@ end o = s:option(Value, "remark", translate("Remarks")) o.width = "auto" o.rmempty = false -o.validate = function(self, value, t) - if value then - local count = 0 - m.uci:foreach(appname, "subscribe_list", function(e) - if e[".name"] ~= t and e["remark"] == value then - count = count + 1 +o.validate = function(self, value, section) + value = (value or ""):match("^%s*(.-)%s*$") + if value == "" then + return nil, translate("Remark cannot be empty.") + end + local duplicate = false + m.uci:foreach(appname, "subscribe_list", function(e) + if e[".name"] ~= section and e["remark"] and e["remark"]:lower() == value:lower() then + duplicate = true + return false + end + end) + if duplicate then + return nil, translate("This remark already exists, please change a new remark.") + end + return value +end +o.write = function(self, section, value) + local old = m:get(section, self.option) or "" + if old:lower() ~= value:lower() then + m.uci:foreach(appname, "nodes", function(e) + if e["group"] and e["group"]:lower() == old:lower() then + m.uci:set(appname, e[".name"], "group", value) end end) - if count > 0 then - return nil, translate("This remark already exists, please change a new remark.") - end - return value end + return Value.write(self, section, value) end o = s:option(DummyValue, "_node_count", translate("Subscribe Info")) diff --git a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe_config.lua b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe_config.lua index 445902df99..e78e5ff6fb 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe_config.lua +++ b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe_config.lua @@ -88,13 +88,41 @@ s.dynamic = false o = s:option(Value, "remark", translate("Subscribe Remark")) o.rmempty = false +o.validate = function(self, value, section) + value = (value or ""):match("^%s*(.-)%s*$") + if value == "" then + return nil, translate("Remark cannot be empty.") + end + local duplicate = false + m.uci:foreach(appname, "subscribe_list", function(e) + if e[".name"] ~= section and e["remark"] and e["remark"]:lower() == value:lower() then + duplicate = true + return false + end + end) + if duplicate then + return nil, translate("This remark already exists, please change a new remark.") + end + return value +end +o.write = function(self, section, value) + local old = m:get(section, self.option) or "" + if old:lower() ~= value:lower() then + m.uci:foreach(appname, "nodes", function(e) + if e["group"] and e["group"]:lower() == old:lower() then + m.uci:set(appname, e[".name"], "group", value) + end + end) + end + return Value.write(self, section, value) +end o = s:option(TextValue, "url", translate("Subscribe URL")) o.rows = 5 o.rmempty = false o.validate = function(self, value) if not value or value == "" then - return nil, translate("URL cannot be empty") + return nil, translate("URL cannot be empty.") end return value:gsub("%s+", ""):gsub("%z", "") end diff --git a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/rule.lua b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/rule.lua index 433ed33569..4d91ee4e74 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/rule.lua +++ b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/rule.lua @@ -85,6 +85,13 @@ if has_xray or has_singbox then .. "
  • " .. "2." .. translate("Once enabled, the rule list can support GeoIP/Geosite rules.") .. "
  • " .. "
  • " .. translate("Note: Increases resource usage; Geosite analysis is only supported in ChinaDNS-NG and SmartDNS modes.") .. "
  • " .. "" + function o.write(self, section, value) + local old = m:get(section, self.option) or "0" + if old ~= value then + m:set("@global[0]", "flush_set", "1") + end + return Flag.write(self, section, value) + end end end diff --git a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/shunt_rules.lua b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/shunt_rules.lua index 715bcf393a..db14415c5c 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/shunt_rules.lua +++ b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/shunt_rules.lua @@ -10,6 +10,10 @@ if not arg[1] or not m:get(arg[1]) then luci.http.redirect(m.redirect) end +function m.on_before_save(self) + m:set("@global[0]", "flush_set", "1") +end + -- Add inline CSS to map description m.description = (m.description or "") .. "\n" .. [[