fix(webui): 手势与横向滚动分家 + 纵向滚动边缘淡出

用户给了两条具体信息(这比我自己猜五轮都管用):
「横向滚动条会与切换视图的手势冲突,我觉得周视图需要卡严条件,
  同时我说的其他硬截断是对应内容项上下滑动会直接被切断」。

## ① 手势卡严(周视图)

冲突是真的:周视图窄屏下必须横向滚(`overflow-auto` + `min-w-[36rem]`),
而我又给整页加了左右滑动翻页 ⇒ 同一次横滑既想滚又想翻,两边都不好用。

规则定死:**手势从可横向滚动的区域里起手,就归滚动条,完全不参与翻页判断**
(触点沿祖先链查找 `overflow-x: auto/scroll` 且真的能滚的容器)。
想翻页就从别处滑(例如上方标题栏)。

## ② 纵向滚动边缘淡出

滚动条本身是"一刀切":卡片滚到边缘被硬生生截断 —— 这就是用户说的"直接被切断"。
给纵向滚动容器(`.overflow-y-auto`)加 12px 上下渐隐遮罩,切得有交代。

只作用在**纵向**容器:横向滚动有自己的滚动条,加纵向遮罩会跟它打架。

## 过程记录(值得记)

这两条改动**第一次没有生效**,因为部署失败了:`/tmp` 是 tmpfs 且已 100% 满,
而部署脚本把构建产物写到硬编码的 `/tmp/agentmail-gateway-build-*` ⇒
`no space left on device`。我差点把"旧构建上的测量结果"当成"改动无效"。
清理后(清掉我自己的探针脚本/截图/旧构建,约 950MB)部署成功。
⚠️ `/tmp` 现在仍占 91%(`gocache` 4.5G 等不全是我的),**下次部署可能还会撞上**;
脚本改成尊重 `TMPDIR` 才是根治(未做)。
This commit is contained in:
2026-09-14 14:35:43 +08:00
parent c9717daa13
commit 1717863c87
5 changed files with 197 additions and 14 deletions

View File

@ -150,9 +150,39 @@ export default function CalendarView() {
* 那是移动端最容易犯的手势错误);同时要求时间 < 600ms避免"慢慢拖"也翻页。
*/
const touch = useRef<{ x: number; y: number; t: number } | null>(null);
/**
* 触点是否落在**可横向滚动**的区域里(周视图就是:`overflow-auto` + `min-w-[36rem]`)。
*
* 用户2026-09-14「横向滚动条会与切换视图的手势冲突我觉得周视图需要卡严条件」。
*
* 冲突是真的:周视图在窄屏下必须横向滚,而我又给整页加了左右滑动翻页 ⇒
* 同一次横滑既想滚又想翻,结果两边都不好用。规则定死:**手势从可横向滚动的
* 区域里开始,就归滚动条,不翻页**。想要翻页就从别处(例如上方的标题栏)滑。
*/
const startsInHorizontalScroller = (target: EventTarget | null, root: EventTarget | null) => {
let el = target as HTMLElement | null;
while (el && el !== root) {
const cs = getComputedStyle(el);
if (
(cs.overflowX === 'auto' || cs.overflowX === 'scroll') &&
el.scrollWidth > el.clientWidth + 4
) {
return true;
}
el = el.parentElement;
}
return false;
};
const onTouchStart = (e: React.TouchEvent) => {
const t = e.touches[0];
if (!t) return;
if (startsInHorizontalScroller(e.target, e.currentTarget)) {
// 卡严条件:这一次手势完全不参与翻页判断
touch.current = null;
return;
}
touch.current = { x: t.clientX, y: t.clientY, t: Date.now() };
};
const onTouchEnd = (e: React.TouchEvent) => {

View File

@ -1354,3 +1354,31 @@ html[data-bg='on'] .glass-card:hover {
flex: 0 0 auto;
width: 320px;
}
/*
* ★ 滚动容器的边缘淡出2026-09-14 用户:「内容项上下滑动会直接被切断」)。
*
* 滚动条本身是"一刀切":卡片滚到边缘就被硬生生截断。给滚动容器加一层
* 上下渐隐的遮罩,切断处变成渐隐 —— 切得有交代,观感也不再像 bug。
*
* 只作用在**纵向**滚动容器(`.overflow-y-auto`):周视图那种**横向**滚动
* 有自己的横向滚动条,加纵向遮罩会跟它打架(用户刚提过手势冲突那件事)。
* 上下各 12px 与列表内边距10px接近静止时几乎看不出滚动时才起作用。
*/
.overflow-y-auto {
-webkit-mask-image: linear-gradient(
to bottom,
transparent 0,
#000 12px,
#000 calc(100% - 12px),
transparent 100%
);
mask-image: linear-gradient(
to bottom,
transparent 0,
#000 12px,
#000 calc(100% - 12px),
transparent 100%
);
}