Compare commits

..

27 Commits

Author SHA1 Message Date
zhengchen.tao 065b354b2a docs: README fork notice 改动清单翻译为英文(面向 GitHub mirror 受众)
FORK.md 仍保持中文。
2026-05-07 15:47:00 +08:00
zhengchen.tao cc7428d06b docs: README 移除已回滚的「交易时间点击标题默认日期选择器」条目
与 FORK.md item #8 的回滚状态对齐(commit 78818470)。
2026-05-07 15:32:24 +08:00
zhengchen.tao 8a8fc72520 LICENSE: fork 版权署名顺序订正 Tao Zhengchen → Zhengchen Tao 2026-05-05 18:57:09 +08:00
zhengchen.tao d36b7b920f ci: 镜像路径 dev/ezbookkeeping → zhengchen.tao/ezbookkeeping
Build Docker Image / build (push) Successful in 24m45s
Build Docker Image / deploy (push) Successful in 1m11s
仓库已转移到 zhengchen.tao 命名空间,build-image.yml 里的 OCI source label /
image tags / build summary 三处硬编码路径同步更新,否则 push 会推到不存在的
dev 命名空间。

NAS 上 nas-infra/ezbookkeeping/docker-compose.yml 的 image 路径仍需手动更新。
2026-05-05 18:20:30 +08:00
zhengchen.tao 994b3547c3 FORK.md 进度表同步:item #8 标记已回滚 2026-05-05 18:10:00 +08:00
zhengchen.tao 7881847062 revert(transaction-time): 回滚 #header label click 改 'date' 模式
Build Docker Image / build (push) Failing after 1m31s
Build Docker Image / deploy (push) Has been skipped
实际无可见效果——用户点的是下方 #title 里的日期/时间文本(上游 commit 368322f9
已实现按点击内容路由),#header label 行很少被点。改回上游行为。

FORK.md item #8 标记为已回滚。
2026-05-05 18:09:31 +08:00
zhengchen.tao c740c941a7 docs: 扩充 README fork notice,列出主要定制项;LICENSE 增加 fork 修改的版权行 2026-05-05 18:05:18 +08:00
zhengchen.tao 6aaa5f7fd7 build-image.yml 注释微调(再次触发,验证 DSM API 1.43 锁定后 build 通)
Build Docker Image / build (push) Successful in 24m15s
Build Docker Image / deploy (push) Successful in 39s
"等" → "等等",顺便利用这次 push 验证 nas-infra cd71de1 把
DOCKER_API_VERSION=1.43 加到 runner 容器 env 后,docker login 是否过。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-04 01:18:07 +08:00
zhengchen.tao 90e70cf9fd build-image.yml 注释微调(触发 concurrency cancel-in-progress 测试)
Build Docker Image / build (push) Failing after 1m48s
Build Docker Image / deploy (push) Has been skipped
把 "重新打包旧 commit / 用自定义 tag / 等" 里多余的斜杠改成顿号,
顺便利用这次 push 验证上一条 d92e4fe3 的 in-progress run 是否被取消。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-04 00:40:43 +08:00
zhengchen.tao d92e4fe31f build/deploy 合并为单 workflow 双 job,删除 deploy.yml
Build Docker Image / build (push) Has been cancelled
Build Docker Image / deploy (push) Has been cancelled
原 workflow_run 链触发会在 Actions 列表产生两条独立 run,UX 割裂。
合并后单 run + dependency graph 显式串联 build → deploy。

代价:失去"不 rebuild 只 redeploy"的 UI 单点触发,临时只想
重启容器需直接 ssh NAS 跑 docker compose up -d。

paths-ignore 同步移除已不存在的 deploy.yml 项。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-04 00:37:44 +08:00
zhengchen.tao 6dce04ebf0 fix(deploy): 加 docker login 步骤,否则 pull 私有 registry 401
build-image 跑过 docker login,但 deploy 是独立 workflow 容器,
凭据不继承。需要在 deploy 这边也登一次同一个 PACKAGES_TOKEN。

deploy.yml 在 paths-ignore 里,这次提交不会触发 build。但会触发
deploy 自己(不在 paths-ignore,且 workflow_dispatch 仍可手动)。
要测的话手动 dispatch Deploy Docker Image 即可。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 23:39:15 +08:00
zhengchen.tao 780386ff28 build-image paths-ignore 加 deploy.yml / sync-upstream.yml
Build Docker Image / build (push) Failing after 22m53s
改 deploy.yml 或 sync-upstream.yml 都不影响镜像内容(前者是部署
脚本、后者是 main reset 脚本),原本会触发整套 ~10 min 的 build
是浪费。把它俩加进 paths-ignore 跳过。

build-image.yml 自己保留触发(不在 ignore 里),这样改 workflow
能 self-test 验证改动有效。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 21:23:18 +08:00
zhengchen.tao 950e10a13c build/deploy workflow 加 concurrency cancel-in-progress
Build Docker Image / build (push) Has been cancelled
并发组 = workflow name + ref。同分支连续 push 时:
- 新 run 入组发现已有 in-progress run → 立即取消旧的,新的开跑
- 最终只构建 + 部署最新代码,省 CI 时间
- 不同分支的 build/deploy 互不干扰(虽然当前只 custom 用)
- build 与 deploy 是两个独立 workflow name,互不影响(build 跑时
  deploy 不会被取消,反之亦然)

CLAUDE.md 同步加"并发取消策略"段说明该行为。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 21:18:39 +08:00
zhengchen.tao 72c64b5fee deploy.yml 移除 CUSTOM_DEPLOY_SCRIPTS 变量,部署脚本内联
Build Docker Image / build (push) Has been cancelled
原 vars.CUSTOM_DEPLOY_SCRIPTS 来自 deploy.yml 上游模板设计,本意是
"通用 hook,让一份 deploy.yml 复用到不同项目"。本仓库只有一个项目
一种部署场景,这层抽象纯属累赘:
- 改部署逻辑得去 Gitea UI 点 Variables,没法 PR review
- git log 看不到部署逻辑改动
- 脚本到底跑啥得对照 yml + Variable 两处

直接把 docker compose pull/up 内联进 deploy.yml,单一事实源在 git。

支持私有 / 公开两种 nas-infra:
- secrets.NAS_INFRA_TOKEN 设了 → 用 token clone(私有适用)
- 没设 → 裸 URL clone(公开适用)

CLAUDE.md 同步更新 deploy.yml 的描述。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 21:10:35 +08:00
zhengchen.tao 1d89af2869 deploy.yml 改自动触发:build 成功后 workflow_run 链式触发
Build Docker Image / build (push) Has been cancelled
- on.workflow_run: 监听 Build Docker Image 完成事件,分支限 custom
- if 条件:仅在 build 成功时跑 deploy(失败时跳过,避免部署半成品)
- workflow_dispatch 保留作为手动备选(重新部署当前镜像 / 应急脚本)
- 脚本生成改 > 覆盖(原 >> 会累积历史脚本)+ 加 set -e 失败即停
- 加 Deploy summary 步骤把触发链路信息写入 GITHUB_STEP_SUMMARY
  方便从 UI 看到本次 deploy 跟在哪次 build 后面

CLAUDE.md 同步更新 workflow 清单 + 流程图:现在 push → build →
deploy 全自动 CD,仅需在 repo Variables 里配 CUSTOM_DEPLOY_SCRIPTS
脚本内容才能产生实际部署效果。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 21:07:09 +08:00
zhengchen.tao 4e8bbc0e5c ci: 注释 paths-ignore 对 empty commit 的 vacuously-skip 行为
Build Docker Image / build (push) Has been cancelled
empirical discovery:c6bb0c85 那个 --allow-empty commit 推送后没有
触发 build。证实 Gitea Actions(同 GitHub Actions)对 paths-ignore
+ empty commit 的处理是"vacuously matches ignore list, skip"。

把这个 quirk 直接注释在 workflow 文件里,后续自己或 Claude 看到
build 没触发时不用再怀疑 trigger 配置错了,知道是 empty commit 的
正常行为。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 20:49:17 +08:00
zhengchen.tao c6bb0c8585 ci: trigger auto-build to verify push trigger works
empty commit, no code changes. 用于验证 build-image.yml 的 push trigger
确实在 commit 推送后自动跑起来,不需要去 Actions UI 手动点。

如果这次 push 后 Gitea Actions 没有自动出现新 run,说明 paths-ignore
对 empty commit 的过滤行为是"vacuously skip",需要至少一个非 ignore 路径
的真实改动才能触发。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 20:47:05 +08:00
zhengchen.tao 806505af82 build-image workflow 改自动触发 + 保留手动备选
Build Docker Image / build (push) Has been cancelled
- on.push.branches: [custom] —— 推送 custom 自动跑
- on.push.paths-ignore:屏蔽 *.md / .gitignore / LICENSE / screenshot/**
  避免 doc-only 改动浪费 ~10 min 构建
- on.workflow_dispatch 保留作为应急通道(重打旧 commit / 自定义 tag)
- checkout ref 兼容两种触发:${{ inputs.branch || github.ref_name }}
  - workflow_dispatch:用用户填的 branch(默认 custom)
  - push:fallback 到 github.ref_name(即触发分支,永远是 custom)
- Build summary 加"触发方式"行,便于区分本次是自动还是手动

预期:本提交本身就会触发自动构建(改了 .gitea/workflows/build-image.yml
不在 paths-ignore 内),相当于 self-test。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 20:41:22 +08:00
zhengchen.tao decbf49b0e docs: ci 分支已删除,更新 CLAUDE.md 与 build summary 措辞
ci 分支于 2026-05-02 删除(默认分支已切到 custom,workflow 文件已
迁回 custom)。更新各处反映"两分支模型 main + custom"的最终状态:

- CLAUDE.md "三个分支" → "两个分支",ci 段改写为"已退役 + 历史
  说明",给后续 Claude 解释 git log 里 555ecc1a 这条迁移提交
- 同步历史里 2026-05-02(后续) 那条加上"随后删掉 ci 分支"的事实
- build-image.yml 的 Build summary 步骤移除"UI 顶部 commit 是 ci"
  的警示注释(workflow 已在 custom,runs 列表 commit 直接就是
  代码 commit,不再需要这条解释)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 20:34:38 +08:00
zhengchen.tao 916ca0a460 docs: CLAUDE.md 更新为 workflow 已迁到 custom 的事实
- 三分支表更新:custom 是 default branch + 持有 workflow,ci
  降级为过渡态历史分支
- 改写"为什么 workflow 在 custom 不在独立分支"段,记录设计决策
  演进的真实理由(runs 列表 UX 优于 meta/code 分离的设计美感)
- workflow 清单从 5 项缩到 3 项,记录 docker-release/snapshot
  已删的事实
- "给后续 Claude" 提示中"不要把工作流提交到 custom" 改为相反
  方向(直接在 custom 改 workflow)
- 同步历史补 555ecc1a (workflow 迁移) 与 75b4d78d (numpad fix)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 18:38:00 +08:00
zhengchen.tao 555ecc1aaf ci: workflow 文件迁到 custom 分支
之前 workflow 在 ci 分支,导致每次 dispatch 后 Gitea Actions 列表
显示的 commit 都是 ci 分支的 workflow 文件 commit,不是被实际构建
的 custom 代码 commit,UX 上误导性强。

挪到 custom 后:
- runs 列表的 commit 字段直接显示真实代码 commit
- workflow_dispatch UI 自动从默认分支(待手动切到 custom)发现
  workflow
- rebase 上游时 workflow 文件随 custom 一起平移,无额外操作

同步移除上游残留的 docker-release.yml / docker-snapshot.yml:
- 触发依赖 secrets.DOCKER_REPO(未配),sync-upstream 推 main
  /tags 时空跑失败
- ci 上已禁用,但文件留着是噪声,本次清掉

ci 分支 .gitea/workflows/ 暂保留作过渡,待用户在 Gitea UI 把
默认分支切到 custom + 验证 build 跑通后,再单独 cleanup ci。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 18:35:53 +08:00
zhengchen.tao 2e6bb9a262 docs: CLAUDE.md 解释 ci/custom 不需保持一致 + UI commit 不等于构建 commit
补充三分支拓扑后的"FAQ 段":

- ci 与 custom 内容不重叠是设计,不是 bug
- Gitea Actions UI 顶部显示的 commit 是 workflow dispatch 触发
  位置(即 ci 的 HEAD),不是构建源代码 commit
- 真实构建的代码 commit 在镜像 tag / OCI revision label /
  workflow 末尾 Build summary 三处都能看到,看 summary 区即可

附两条可选替代方案(workflow 挪 custom / 加 push trigger 自动构建),
说明当前选择的中间路径理由。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 18:26:40 +08:00
zhengchen.tao 75b4d78d78 fix(numpad): 修小键盘点击卡顿,touch-action: none → manipulation
诊断:用户反馈仅小键盘点击有延迟感,其他按钮正常。范围缩小后定位到
.numpad-button 上的 touch-action: none(上游 e178a079 引入)与 F7
内部 tap 事件处理叠加,让 click 事件合成慢一拍。backspace(自定义
.numpad-backspace-button 类)不受影响,刚好印证范围。

修复:改为 touch-action: manipulation(W3C 标准"快速点击"值),禁双
击缩放消除老 300ms 延迟,但保留 click 事件正常合成。

FORK.md #11 状态:🔍 调查中 → 🟢 已完成,附真因记录避免后续误诊。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 18:09:40 +08:00
zhengchen.tao 4fdb29b119 docs: CLAUDE.md 加 ci 分支 workflow 清单 + 链 FORK.md
ci 分支 5 个 workflow(sync-upstream / build-image / deploy /
docker-snapshot / docker-release)全部列表化,含触发条件、职责、
当前状态。明确"日常只用 sync-upstream + build-image 两个,
其他三个要么按需配置要么后续清理"。

custom 分支说明里加链接指 FORK.md(feature 维度的清单),
顶部说明区域厘清"meta(CLAUDE.md)vs 改动清单(FORK.md)vs
通用决策框架(不入库)"三层关系。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 17:58:43 +08:00
zhengchen.tao 3da6150802 docs: rename MY_REQUIREMENTS.md → FORK.md, drop stale DEPLOY.md
- 重命名为 FORK.md,对接更通用的 fork-doc 命名约定
- DEPLOY.md 内容全过期(ghcr.io 镜像、myrequirement 分支、
  docker run 风格部署),全部已废 — 部署文档现在两层:
  nas-infra/README.md(compose level)+ CLAUDE.md(CI 排查)
- README.md 顶部加一行 fork notice,链到 FORK.md 与 CLAUDE.md
  (单行变更,rebase 友好)
- FORK.md 顶部加关联文档表

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 17:58:34 +08:00
zhengchen.tao c2e49a991a docs: CLAUDE.md 加 backend 测试踩坑 + 通用排查原则
CI 故障排查路径表加一行"测试/lint 失败 → 先看 Dockerfile ARG",
强调先对齐上游 CI 跳过开关(BUILD_PIPELINE / CHECK_3RD_API /
SKIP_TESTS)再考虑改测试代码。同步历史补 2026-05-02 第三层修复。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 16:07:58 +08:00
zhengchen.tao b8ad2bc17c docs: 加仓库级 CLAUDE.md(分支拓扑 + 同步流程 + CI 排查路径)
记录 fork 工作流(main 锚 tag / custom 改动 / ci 工作流),
2026-05-01 rebase 与 2026-05-02 build 修复历史,
以及给后续 Claude 会话的 CI 故障分流路径表。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 15:35:47 +08:00
2 changed files with 27 additions and 65 deletions
+9 -17
View File
@@ -84,8 +84,7 @@
1 2 3 +
C 0 . OK
```
- ⌫ 单击退格;按住不放先删一位、约 500ms 后清空全部(长按响应细节见 #11 第二阶段)
- C 一键清除全部
- ⌫ 单击退格,长按清除;C 清除全部
- 涉及文件:`src/components/mobile/NumberPadSheet.vue`
---
@@ -137,24 +136,17 @@
- Tab 切换动画保持原样(设置中已有开关可控制)
- 涉及文件:`src/styles/mobile/global.scss`
### 11. 🟢 小键盘点击卡顿(三次修正)
**描述:** 移动端小键盘点击有延迟感。
### 11. 🟢 小键盘点击卡顿(修正:范围非全局
**描述:** 移动端点击按钮有延迟感。
**第一阶段2026-05-02`touch-action: none` 引发的 300ms 双击延迟:** 上游在 `.numpad-button` 上设了 `touch-action: none`commit `e178a079` "code refactor" by MaysWind),与浏览器双击缩放检测叠加后保留了老式 300ms 点击延迟
- 修复:`.numpad-button``touch-action: none` 改为 `touch-action: manipulation`W3C 标准"快速点击"值,禁双击缩放)
**真因2026-05-02 定位):** **不是**全局点击/接口响应问题。诊断后确认仅小键盘有卡顿,其他按钮正常。根因是上游在 `.numpad-button` 上设了 `touch-action: none`commit `e178a079` "code refactor" by MaysWind),与 F7 内部 tap 处理叠加后让 click 事件合成慢一拍。backspace(个人新增 `.numpad-backspace-button` 类)不受影响,刚好佐证范围
**第二阶段(2026-05-08)退格键 `@taphold` 等待 750ms** backspace 单点仍可感知延迟。根因是 `@click` + `@taphold` 让 F7 必须等 ~750ms 判别 tap vs hold,期间 click 被抑制。
- 修复:弃用 `@click="backspace" @taphold="clear()"`,改为原生 `pointerdown`/`pointerup`/`pointercancel`/`pointerleave` + 自管定时器
- 行为:单击立即删一位;按住不放先删一位、约 500ms 后清空全部
**已完成:**
- `.numpad-button``touch-action: none` 改为 `touch-action: manipulation`
- `manipulation` 是 W3C 标准的"快速点击"值:禁双击缩放(消除老 300ms 延迟)但保留 click 事件正常合成
- 涉及文件:`src/components/mobile/NumberPadSheet.vue`
**第三阶段(2026-05-08)所有数字/运算键也延迟:** 第一阶段修完后用户反馈数字键仍有"等一拍"感。怀疑 F7 整套 tap 处理(含 active-state 检测、`fastClicks` 兼容代码、tap-hold 全局监听)即便不显式声明 `@taphold` 也会给 `@click` 加上判别期
- 修复:把所有按键(数字 0-9、运算 ×−+、C 清空、小数点/双零、OK 确认)的 `@click` 全部换成 `@pointerdown.left`
- 原理:`pointerdown` 在按下瞬间触发,绕开 F7 的 tap 合成路径。`.left` 修饰符限制只响应主键(触屏 button=0 始终满足,桌面右键不会误触发)
- F7 的 `.active-state` 视觉反馈基于独立的 touchstart/touchend 监听,不依赖 `@click`,按下视觉效果保留
涉及文件:`src/components/mobile/NumberPadSheet.vue`
**附带认知:**#11 假设是"全局点击响应慢"或"接口慢",与 #12 离线缓存挂钩调研。实际诊断后跟那两条都无关——纯 F7 框架 tap 合成 + 双击缩放 + taphold 检测三者叠加。最终通过完全弃用 `@click` 改 pointer 事件解决。该认知值得记录避免后续误诊路径。
**附带认知:**#11 假设是"全局点击响应慢"或"接口慢",与 #12 离线缓存挂钩调研。实际诊断后跟那两条都无关,纯 CSS `touch-action` 与框架 tap 处理叠加导致。该认知值得记录避免后续误诊路径
---
+18 -48
View File
@@ -8,11 +8,7 @@
</div>
<div class="numpad-values">
<span id="numpad-value" class="numpad-value" :class="currentDisplayNumClass" @click="onDisplayValueClick">{{ currentDisplay }}</span>
<f7-button class="numpad-backspace-button"
@pointerdown="onBackspacePointerDown"
@pointerup="onBackspacePointerEnd"
@pointercancel="onBackspacePointerEnd"
@pointerleave="onBackspacePointerEnd">
<f7-button class="numpad-backspace-button" @click="backspace" @taphold="clear()">
<f7-icon class="icon-with-direction" f7="delete_left"></f7-icon>
</f7-button>
</div>
@@ -25,55 +21,55 @@
</f7-popover>
<div class="numpad-buttons">
<f7-button class="numpad-button numpad-button-num" @pointerdown.left="inputNum(7)">
<f7-button class="numpad-button numpad-button-num" @click="inputNum(7)">
<span class="numpad-button-text numpad-button-text-normal">{{ digits[7] }}</span>
</f7-button>
<f7-button class="numpad-button numpad-button-num" @pointerdown.left="inputNum(8)">
<f7-button class="numpad-button numpad-button-num" @click="inputNum(8)">
<span class="numpad-button-text numpad-button-text-normal">{{ digits[8] }}</span>
</f7-button>
<f7-button class="numpad-button numpad-button-num" @pointerdown.left="inputNum(9)">
<f7-button class="numpad-button numpad-button-num" @click="inputNum(9)">
<span class="numpad-button-text numpad-button-text-normal">{{ digits[9] }}</span>
</f7-button>
<f7-button class="numpad-button numpad-button-function no-right-border" @pointerdown.left="setSymbol('×')">
<f7-button class="numpad-button numpad-button-function no-right-border" @click="setSymbol('×')">
<span class="numpad-button-text numpad-button-text-normal">&times;</span>
</f7-button>
<f7-button class="numpad-button numpad-button-num" @pointerdown.left="inputNum(4)">
<f7-button class="numpad-button numpad-button-num" @click="inputNum(4)">
<span class="numpad-button-text numpad-button-text-normal">{{ digits[4] }}</span>
</f7-button>
<f7-button class="numpad-button numpad-button-num" @pointerdown.left="inputNum(5)">
<f7-button class="numpad-button numpad-button-num" @click="inputNum(5)">
<span class="numpad-button-text numpad-button-text-normal">{{ digits[5] }}</span>
</f7-button>
<f7-button class="numpad-button numpad-button-num" @pointerdown.left="inputNum(6)">
<f7-button class="numpad-button numpad-button-num" @click="inputNum(6)">
<span class="numpad-button-text numpad-button-text-normal">{{ digits[6] }}</span>
</f7-button>
<f7-button class="numpad-button numpad-button-function no-right-border" @pointerdown.left="setSymbol('')">
<f7-button class="numpad-button numpad-button-function no-right-border" @click="setSymbol('')">
<span class="numpad-button-text numpad-button-text-normal">&minus;</span>
</f7-button>
<f7-button class="numpad-button numpad-button-num" @pointerdown.left="inputNum(1)">
<f7-button class="numpad-button numpad-button-num" @click="inputNum(1)">
<span class="numpad-button-text numpad-button-text-normal">{{ digits[1] }}</span>
</f7-button>
<f7-button class="numpad-button numpad-button-num" @pointerdown.left="inputNum(2)">
<f7-button class="numpad-button numpad-button-num" @click="inputNum(2)">
<span class="numpad-button-text numpad-button-text-normal">{{ digits[2] }}</span>
</f7-button>
<f7-button class="numpad-button numpad-button-num" @pointerdown.left="inputNum(3)">
<f7-button class="numpad-button numpad-button-num" @click="inputNum(3)">
<span class="numpad-button-text numpad-button-text-normal">{{ digits[3] }}</span>
</f7-button>
<f7-button class="numpad-button numpad-button-function no-right-border" @pointerdown.left="setSymbol('+')">
<f7-button class="numpad-button numpad-button-function no-right-border" @click="setSymbol('+')">
<span class="numpad-button-text numpad-button-text-normal">&plus;</span>
</f7-button>
<f7-button class="numpad-button numpad-button-num" @pointerdown.left="clear()">
<f7-button class="numpad-button numpad-button-num" @click="clear()">
<span class="numpad-button-text numpad-button-text-normal">C</span>
</f7-button>
<f7-button class="numpad-button numpad-button-num" @pointerdown.left="inputNum(0)">
<f7-button class="numpad-button numpad-button-num" @click="inputNum(0)">
<span class="numpad-button-text numpad-button-text-normal">{{ digits[0] }}</span>
</f7-button>
<f7-button class="numpad-button numpad-button-num" v-if="supportDecimalSeparator" @pointerdown.left="inputDecimalSeparator()">
<f7-button class="numpad-button numpad-button-num" v-if="supportDecimalSeparator" @click="inputDecimalSeparator()">
<span class="numpad-button-text numpad-button-text-normal">{{ decimalSeparator }}</span>
</f7-button>
<f7-button class="numpad-button numpad-button-num" v-if="!supportDecimalSeparator" @pointerdown.left="inputDoubleNum(0)">
<f7-button class="numpad-button numpad-button-num" v-if="!supportDecimalSeparator" @click="inputDoubleNum(0)">
<span class="numpad-button-text numpad-button-text-normal">{{ `${digits[0]}${digits[0]}` }}</span>
</f7-button>
<f7-button class="numpad-button numpad-button-confirm no-right-border no-bottom-border" fill @pointerdown.left="confirm()">
<f7-button class="numpad-button numpad-button-confirm no-right-border no-bottom-border" fill @click="confirm()">
<span :class="{ 'numpad-button-text': true, 'numpad-button-text-confirm': !currentSymbol }">{{ confirmText }}</span>
</f7-button>
</div>
@@ -330,31 +326,6 @@ function clear(): void {
currentSymbol.value = '';
}
const BACKSPACE_HOLD_TO_CLEAR_MS = 500;
let backspaceClearTimer: ReturnType<typeof setTimeout> | null = null;
function onBackspacePointerDown(event: PointerEvent): void {
// 按下立刻删一位(消除 F7 taphold 判别期带来的点击延迟)
if (event.button !== undefined && event.button !== 0) {
return;
}
backspace();
if (backspaceClearTimer !== null) {
clearTimeout(backspaceClearTimer);
}
backspaceClearTimer = setTimeout(() => {
clear();
backspaceClearTimer = null;
}, BACKSPACE_HOLD_TO_CLEAR_MS);
}
function onBackspacePointerEnd(): void {
if (backspaceClearTimer !== null) {
clearTimeout(backspaceClearTimer);
backspaceClearTimer = null;
}
}
function paste(): void {
showPastePopover.value = false;
@@ -471,7 +442,6 @@ function onSheetOpen(): void {
}
function onSheetClosed(): void {
onBackspacePointerEnd();
close();
}