diff --git a/apfree-wifidog/Makefile b/apfree-wifidog/Makefile index f23c5c9d9..92d31bdc8 100644 --- a/apfree-wifidog/Makefile +++ b/apfree-wifidog/Makefile @@ -8,12 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=apfree-wifidog -PKG_RELEASE:=10 +PKG_RELEASE:=11 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://github.com/liudf0716/apfree-wifidog.git -PKG_SOURCE_DATE:=2026-10-25 -PKG_SOURCE_VERSION:=9997baf26c737102940dd3a44e9d95c84dd57dab +PKG_SOURCE_DATE:=2026-11-03 +PKG_SOURCE_VERSION:=f012073104f2a1aa75954b5bc0e013b14bf663d4 PKG_MIRROR_HASH:=skip PKG_MAINTAINER:=Dengfeng Liu @@ -51,7 +51,6 @@ define Package/apfree-wifidog/install $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/wdctlx $(1)/usr/bin/wdctlx $(INSTALL_DIR) $(1)/usr/sbin $(INSTALL_DIR) $(1)/etc - $(INSTALL_DATA) $(PKG_BUILD_DIR)/wifidog-msg.html $(1)/etc/ $(INSTALL_DATA) $(PKG_BUILD_DIR)/wifidog-redir.html $(1)/etc/ $(INSTALL_DATA) $(PKG_BUILD_DIR)/wifidog-redir.html.front $(1)/etc/ $(INSTALL_DATA) $(PKG_BUILD_DIR)/wifidog-redir.html.rear $(1)/etc/ diff --git a/gately/Makefile b/gately/Makefile index 0dc3da05a..632f1f0ea 100644 --- a/gately/Makefile +++ b/gately/Makefile @@ -5,8 +5,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=gately -PKG_VERSION:=0.6.3 -PKG_RELEASE:=23 +PKG_VERSION:=0.6.3.5 +PKG_RELEASE:=24 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/wangwanjie/gately/tar.gz/v$(PKG_VERSION)? diff --git a/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/log.js b/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/log.js index c906cc055..c82b66b4a 100644 --- a/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/log.js +++ b/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/log.js @@ -25,7 +25,7 @@ document.querySelector('head').appendChild(E('style', [ ' ])); -const hm_dir = '/var/run/fchomo'; +const RUN_DIR = '/var/run/fchomo'; function getRuntimeLog(name, option_index, section_id, in_table) { const filename = this.option.split('_')[1]; @@ -84,7 +84,7 @@ function getRuntimeLog(name, option_index, section_id, in_table) { let log; poll.add(function() { - return fs.read_direct(String.format('%s/%s.log', hm_dir, filename), 'text') + return fs.read_direct(String.format('%s/%s.log', RUN_DIR, filename), 'text') .then((res) => { log = E('pre', { 'wrap': 'pre' }, [ res.trim() || _('Log is empty.') diff --git a/luci-app-open-box/Makefile b/luci-app-open-box/Makefile index 09ca29181..b51bbf3fe 100644 --- a/luci-app-open-box/Makefile +++ b/luci-app-open-box/Makefile @@ -1,8 +1,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-open-box -PKG_VERSION:=0.1.390 -PKG_RELEASE:=59 +PKG_VERSION:=0.1.392 +PKG_RELEASE:=60 PKG_MAINTAINER:=liandu2024 PKG_LICENSE:=GPL-3.0-or-later diff --git a/luci-theme-liquid/Makefile b/luci-theme-liquid/Makefile index a33ddeb04..61b00f34e 100644 --- a/luci-theme-liquid/Makefile +++ b/luci-theme-liquid/Makefile @@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-theme-liquid PKG_VERSION:=1.0 -PKG_RELEASE:=3 +PKG_RELEASE:=4 PKG_MAINTAINER:=然后七年 PKG_LICENSE:=Apache-2.0 diff --git a/luci-theme-liquid/htdocs/luci-static/liquid/cascade.css b/luci-theme-liquid/htdocs/luci-static/liquid/cascade.css index b016da4f1..b21c63707 100644 --- a/luci-theme-liquid/htdocs/luci-static/liquid/cascade.css +++ b/luci-theme-liquid/htdocs/luci-static/liquid/cascade.css @@ -5290,3 +5290,24 @@ body:is([data-page="admin-system-startup"], [data-page="admin/system/startup"]) min-width: min(420px, 75vw); max-width: 75vw; } + +/* ===== 登录页防页脚遮挡(几何触发,仅重叠的设备生效)===== + #liquid-login 是 fixed 全屏 + flex 垂直居中;页脚 p.luci 是 fixed bottom:4 + z-index:2001 —— 矮视口(折叠机外屏)或 iOS 工具栏展开时,卡片下半截(登录 + 按钮)被页脚文字压住,内屏(大屏)轻微覆盖。 + main.js 实测"整个 stack(顶部胶囊+卡片)相对视口与页脚"重叠才加类: + · clear → 给页脚留 72px 净空(卡片上移,解决轻微覆盖) + · fit → 仍不行则整栈 zoom 等比缩小(小屏不滚动、页脚固定可见、 + 顶部胶囊不被裁——用户要求:缩小登录页所有元素比例) + 其它平台视口够高 → 不重叠 → 不加类 → 渲染完全不变。 + 注:不靠 UA/分辨率猜设备(iOS UA 无机型信息),靠几何测量。 */ +body.liquid-login.liquid-login-clear #liquid-login { + padding-bottom: 72px; +} + +/* 第二级:整栈等比缩小(zoom 由 main.js 按几何计算后写入 inline style)。 + 目的是"小屏不滚动、页脚固定可见"(用户要求:缩小登录页所有元素比例), + 同时保证顶部胶囊(暗黑模式/颜色选择)不被裁掉。 */ +body.liquid-login.liquid-login-fit #liquid-login .liquid-login-stack { + /* zoom 在 inline style 上;此处只留调试标记用的 class,无强制样式 */ +} diff --git a/luci-theme-liquid/htdocs/luci-static/liquid/main.js b/luci-theme-liquid/htdocs/luci-static/liquid/main.js index 364f5c3ba..b1b43c02e 100644 --- a/luci-theme-liquid/htdocs/luci-static/liquid/main.js +++ b/luci-theme-liquid/htdocs/luci-static/liquid/main.js @@ -1910,6 +1910,95 @@ m.insertBefore(w.firstChild, m.firstChild); } + /* ===== 登录页:卡片与固定页脚的重叠检测(Duo 外屏/内屏、iOS 工具栏展开等)===== + 起因:外屏登录框下半截被页脚压住(连登录按钮都被盖)、内屏轻微覆盖。 + 为什么不用 UA/分辨率判断设备:iOS 的 EdgiOS UA 只有 OS 版本+浏览器构建号, + 读不到机型与屏幕形态;分辨率能区分内外屏但会误伤同尺寸的其它设备。 + 这里直接量几何——整个 stack(顶部胶囊+卡片)的上下边 vs 视口安全区与 + 页脚顶线(fixed bottom:4+自身高),重叠才分级处理: + clear=页脚留净空(卡片上移) / fit=整栈 zoom 等比缩小(不滚动、页脚始终 + 可见、顶部胶囊不裁)。不重叠的平台零变化。监听 resize / orientationchange + / visualViewport 以覆盖 iOS 工具栏展开收起引起的视口变化。 */ + function syncLoginFooterClearance() { + var body = document.body; + if (!body || !body.classList.contains('liquid-login')) + return; + var overlay = document.getElementById('liquid-login'); + var stack = overlay && overlay.querySelector('.liquid-login-stack'); + var card = stack && stack.querySelector('.modal.login'); + var foot = document.querySelector('p.luci'); + if (!overlay || !stack || !card || !foot) + return; + + /* 复位到"零变化"基线 */ + body.classList.remove('liquid-login-clear'); + body.classList.remove('liquid-login-fit'); + stack.style.zoom = ''; + + function geom() { + var sr = stack.getBoundingClientRect(); + var fh = foot.offsetHeight || 0; + var vh = overlay.clientHeight; + return { + top: sr.top, + bottom: sr.bottom, + height: sr.height, + footTop: vh - 4 - fh, + vh: vh + }; + } + function fits() { + var g = geom(); + /* 顶部不被裁(留8px)、底部不进页脚区(留8px气口)、卡片不超高 */ + return g.top >= 8 && g.bottom <= g.footTop - 8 && + card.getBoundingClientRect().height <= g.vh - 8; + } + + if (fits()) + return; /* 不重叠 → 一个 class 都不加(其它平台零变化) */ + + /* 级1 clear:给页脚留净空,卡片整体上移一点(解决轻微覆盖) */ + body.classList.add('liquid-login-clear'); + if (fits()) + return; + + /* 级2 fit:整栈等比缩小(zoom)——小屏不滚动、页脚固定可见、 + 顶部胶囊不被裁(用户要求:缩小登录页所有元素比例)。 + 注意 flex 是垂直居中:栈底 = (内容高+缩放后高)/2,不能按顶对齐公式 + 算,改为"保留 clear 净空 + 逐次收敛"——每缩 8% 复测一次直到 fits。 */ + body.classList.add('liquid-login-clear'); /* fit 期间保留净空,整体上移 */ + body.classList.add('liquid-login-fit'); + var scale = 1; + stack.style.zoom = scale; + for (var i = 0; i < 12 && !fits(); i++) { + scale = Math.max(scale * 0.92, 0.4); /* 0.4 兜底,避免缩到不可读 */ + stack.style.zoom = scale; + if (scale <= 0.401) + break; + } + } + + function scheduleLoginFooterClearance() { + if (window.requestAnimationFrame) + window.requestAnimationFrame(syncLoginFooterClearance); + else + syncLoginFooterClearance(); + } + + scheduleLoginFooterClearance(); + window.addEventListener('load', scheduleLoginFooterClearance); + window.addEventListener('resize', scheduleLoginFooterClearance); + window.addEventListener('orientationchange', scheduleLoginFooterClearance); + if (window.visualViewport) + window.visualViewport.addEventListener('resize', scheduleLoginFooterClearance); + setTimeout(scheduleLoginFooterClearance, 300); /* 字体/布局落定后复核 */ + if (window.MutationObserver) { + /* 输密码报错会让卡片变高 → 重新判定 */ + new MutationObserver(scheduleLoginFooterClearance) + .observe(document.getElementById('liquid-login') || document.body, + { childList: true, subtree: true, characterData: true }); + } + /* 窗口尺寸变化时重新计算已打开下拉框的方向 */ window.addEventListener('resize', function () { setTimeout(adjustDropdownDirection, 60); diff --git a/xkcptun/Makefile b/xkcptun/Makefile index 5b6dd9974..c3d75e5bd 100644 --- a/xkcptun/Makefile +++ b/xkcptun/Makefile @@ -8,12 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=xkcptun -PKG_RELEASE:=9 +PKG_RELEASE:=10 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://github.com/liudf0716/xkcptun.git -PKG_SOURCE_DATE:=2026-10-25 -PKG_SOURCE_VERSION:=e5ec5ed74a20a75e9c3b22221d7f07346ffa0d1e +PKG_SOURCE_DATE:=2026-11-03 +PKG_SOURCE_VERSION:=cddcd5e6d5dfa5d376dec0d2e8ef35fdc9409967 PKG_MIRROR_HASH:=skip PKG_MAINTAINER:=Dengfeng Liu