Docker Build and Push / build-image (push) Successful in 4m9s
1. 回滚键盘遮挡统一方案 (真机测试不通过, 需求搁置): 恢复 TaskDetail/ UserPicker/CopyTaskPopup/ProjectManage 与 useKeyboardInset 到 9fea1a5^, 删除 useKeyboardInsetWatcher / .kb-safe / interactive-widget=resizes-content 2. 任务详情页样式随 1 一并恢复提交前状态 (含底部拷贝/删除按钮) 3. 列表视图换列改为卡片拖动: 新 useRowDrag (长按 400ms 行抬起, 左右 80px/列步进, 行尾徽标显示目标列, 松手落列), 移除长按 ActionSheet —— 旧长按与复选框/行点击互相误触, 抬手合成 click 落在控件上触发状态切换 4. 看板拖动防误触: 任务区禁长按文字选择与系统菜单 (输入框除外); pointercancel 只放弃不提交; 拖动结束 350ms 内抑制 click 误开详情; 状态点/⋯/子任务行 pointerdown 不冒泡, 不发起拖动 5. 看板横滑扩展到整屏: .page-transition 补 height:100% 打通 app-main → page-with-navbar 百分比链, board-wrap 撑满剩余高度 已验证: kb-safe/Watcher/onLongPress 残留引用清零, 逐文件 diff 审阅通过; 本机无 Node 运行时, 未跑 vite build
28 lines
1.0 KiB
JavaScript
28 lines
1.0 KiB
JavaScript
import { useEffect, useState } from 'react'
|
|
|
|
// 键盘弹出时的"插入量": window.innerHeight 与 visualViewport.height 的差
|
|
// Android WebView 键盘弹出时 visualViewport 变小; 用它把底部弹层的内容抬到键盘上方,
|
|
// 避免输入框(如任务详情里的"添加子任务")被键盘遮挡。
|
|
// 阈值 90px 过滤掉地址栏收起之类的轻微抖动; 无 visualViewport 时恒为 0 (iOS 原生键盘通常整体缩放, 无需处理)。
|
|
export default function useKeyboardInset() {
|
|
const [inset, setInset] = useState(0)
|
|
|
|
useEffect(() => {
|
|
const vv = window.visualViewport
|
|
if (!vv) return
|
|
const onChange = () => {
|
|
const diff = window.innerHeight - vv.height - vv.offsetTop
|
|
setInset(diff > 90 ? Math.round(diff) : 0)
|
|
}
|
|
vv.addEventListener('resize', onChange)
|
|
vv.addEventListener('scroll', onChange)
|
|
onChange()
|
|
return () => {
|
|
vv.removeEventListener('resize', onChange)
|
|
vv.removeEventListener('scroll', onChange)
|
|
}
|
|
}, [])
|
|
|
|
return inset
|
|
}
|