feat: 业务逻辑对齐 + 首页/弹框七项减法 + 终端页四项体验修复
业务逻辑(用户定稿): - 点主机总是新建会话(会话:主机=多:1);activate 选中断线会话自动重连 - 「直接输入」凭据保存时自动落 Keychain(去重复用),主机只存引用 - 主机编辑页可就地新建 Tailscale 连接;删无人引用的旧 HostsListView 首页/弹框减法: - 删侧边栏「连接新主机」、无 tmux 横幅与安装引导、页头「新建连接」 - 搜索移到「全部主机」行;添加主机虚线卡与主机卡等高(骨架复刻) - 会话卡加 ✕ + 复用终端页同款二次确认 - 会话选择器 sheet → 项目风格居中弹框(去手柄/Header/最近) 终端页修复: - 侧边栏会话列表改创建顺序,切换不再重排抖动 - 焦点高亮上移到 pane 容器边框(四边完整,去负 padding) - 软键盘双重让位修复:画布忽略键盘 + TXKeyboardObserver 显式让位一次 - 自动聚焦:focusTick 脉冲强制翻转 FocusState + surface 就绪补聚焦; vendor 补 iPadOS 触摸板 indirectPointer 的 becomeFirstResponder Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -212,6 +212,9 @@ final class TerminalSession: ObservableObject, Identifiable {
|
||||
@Published var isMinimized = false
|
||||
/// 最后一次成为焦点的时刻(首页「上次活跃」+ 会话卡排序)。
|
||||
@Published var lastActiveAt = Date()
|
||||
/// 键盘焦点脉冲:进终端 / 侧边栏切到本会话时 +1,终端视图据此 becomeFirstResponder
|
||||
/// —— 选中即可直接输入,不必再点一下屏幕(用户裁决;onAppear 只在常驻挂载时来一次,不够)。
|
||||
@Published var focusTick = 0
|
||||
/// 链路状态(状态胶囊/状态点)。由 `syncUI()` 从 phase + 出口计划推导。
|
||||
@Published var link: LinkState = .offline
|
||||
|
||||
@@ -853,19 +856,8 @@ final class TerminalSession: ObservableObject, Identifiable {
|
||||
scheduleTmuxBootstrap()
|
||||
}
|
||||
|
||||
/// 用户关掉横幅(这台主机本次会话不再提示)。
|
||||
func dismissTmuxBanner() { tmuxUnavailable = false }
|
||||
|
||||
/// 把一条命令塞进当前终端执行(安装引导用)。执行后给足时间装包,再自动重试进 tmux。
|
||||
func runInTerminal(_ command: String) {
|
||||
sendToTerminal(command + "\n")
|
||||
tmuxUnavailable = false
|
||||
Task { [weak self] in
|
||||
try? await Task.sleep(nanoseconds: 8_000_000_000)
|
||||
guard let self, self.tmuxController == nil else { return }
|
||||
self.retryTmux()
|
||||
}
|
||||
}
|
||||
// (dismissTmuxBanner / runInTerminal 已随「未检测到 tmux」横幅与安装引导一起删除;
|
||||
// tmuxUnavailable 仍保留 —— 底部状态行据它显示「无 tmux · 客户端窗口」。)
|
||||
|
||||
/// 往当前承载通道写入(mosh 接管后走 mosh,否则走 SSH)——与终端输入同一条路径。
|
||||
private func sendToTerminal(_ text: String) {
|
||||
|
||||
Reference in New Issue
Block a user