diff --git a/NucleicRemote/NucleicRemote/Views/Transcript/ToolGroupRow.swift b/NucleicRemote/NucleicRemote/Views/Transcript/ToolGroupRow.swift index 4c4538a..0566120 100644 --- a/NucleicRemote/NucleicRemote/Views/Transcript/ToolGroupRow.swift +++ b/NucleicRemote/NucleicRemote/Views/Transcript/ToolGroupRow.swift @@ -477,6 +477,51 @@ private struct ToolBlock: View { } } +/// The leading glyph and muted one-liner for a lock line folded onto a tool card — the phone echo +/// of the Mac's `LockLineStyle`. +enum LockLineStyle { + static func icon(_ state: NoteLock.State) -> String { + switch state { + case .waiting: return "hourglass" + case .acquired: return "lock.fill" + case .released: return "lock.open" + } + } + + static func text(_ lock: NoteLock) -> String { + let paths = pathList(lock.paths) + switch lock.state { + case .waiting: return "Waiting for lock · \(paths)" + case .acquired: return "Locked · \(paths)" + case .released: return "Lock released · \(paths)" + } + } + + /// Up to two repo-relative paths, then a "+N more" tail. + private static func pathList(_ paths: [String]) -> String { + guard !paths.isEmpty else { return "no files" } + let shown = paths.prefix(2).joined(separator: ", ") + let extra = paths.count - min(paths.count, 2) + return extra > 0 ? "\(shown) +\(extra) more" : shown + } +} + +/// One folded lock line on a tool card: a small muted glyph + status, matching the card's +/// secondary detail styling. The phone echo of the Mac's `LockLineRow`. +struct LockLineRow: View { + let lock: NoteLock + var body: some View { + HStack(alignment: .firstTextBaseline, spacing: 6) { + Image(systemName: LockLineStyle.icon(lock.state)) + .font(.caption2).foregroundStyle(.tertiary).frame(width: 15) + Text(LockLineStyle.text(lock)) + .font(.caption).foregroundStyle(.secondary) + .lineLimit(1).truncationMode(.middle) + Spacer(minLength: 0) + } + } +} + /// SF Symbols for the common tools + file-change kinds, so a glance reads the action. enum ToolGlyph { static func icon(_ name: String) -> String {