Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -198,49 +198,48 @@ struct HeartbeatSettingsTab: View {
.padding(.vertical, VSpacing.lg)
} else {
ForEach(runs, id: \.id) { run in
Button {
withAnimation(VAnimation.fast) {
expandedRunId = expandedRunId == run.id ? nil : run.id
}
} label: {
VStack(alignment: .leading, spacing: 0) {
HStack(spacing: VSpacing.md) {
resultBadge(run.result)
VStack(alignment: .leading, spacing: 2) {
Text(run.title)
.font(VFont.body)
.foregroundColor(VColor.textPrimary)
.lineLimit(1)
Text(formatTimestamp(run.createdAt))
.font(VFont.caption)
.foregroundColor(VColor.textMuted)
}
Spacer()
Image(systemName: expandedRunId == run.id ? "chevron.down" : "chevron.right")
.font(.system(size: 10, weight: .semibold))
VStack(alignment: .leading, spacing: 0) {
HStack(spacing: VSpacing.md) {
resultBadge(run.result)
VStack(alignment: .leading, spacing: 2) {
Text(run.title)
.font(VFont.body)
.foregroundColor(VColor.textPrimary)
.lineLimit(1)
Text(formatTimestamp(run.createdAt))
.font(VFont.caption)
.foregroundColor(VColor.textMuted)
}
.padding(VSpacing.sm)

if expandedRunId == run.id {
Text(run.summary?.isEmpty == false ? run.summary! : "No summary available")
.font(VFont.mono)
.foregroundColor(VColor.textSecondary)
.textSelection(.enabled)
.padding(VSpacing.sm)
.frame(maxWidth: .infinity, alignment: .leading)
.background(VColor.surface)
.clipShape(RoundedRectangle(cornerRadius: VRadius.md))
.overlay(
RoundedRectangle(cornerRadius: VRadius.md)
.stroke(VColor.surfaceBorder, lineWidth: 1)
)
.padding(.horizontal, VSpacing.sm)
.padding(.bottom, VSpacing.sm)
Spacer()
Image(systemName: expandedRunId == run.id ? "chevron.down" : "chevron.right")
.font(.system(size: 10, weight: .semibold))
.foregroundColor(VColor.textMuted)
}
.padding(VSpacing.sm)
.contentShape(Rectangle())
.onTapGesture {
withAnimation(VAnimation.fast) {
expandedRunId = expandedRunId == run.id ? nil : run.id
}
}
Comment on lines +220 to 224
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve button semantics for run-row expansion

Replacing the Button with onTapGesture removes built-in control semantics, so this row is no longer keyboard-activatable or exposed as an actionable element to VoiceOver users. In the Settings list this turns expand/collapse into a pointer-only interaction for accessibility users, which is a functional regression from the previous implementation. Please keep a Button (and add .contentShape(Rectangle()) to its label) or explicitly restore equivalent accessibility role/action and keyboard activation behavior.

Useful? React with 👍 / 👎.


if expandedRunId == run.id {
Text(run.summary?.isEmpty == false ? run.summary! : "No summary available")
.font(VFont.mono)
.foregroundColor(VColor.textSecondary)
.textSelection(.enabled)
.padding(VSpacing.sm)
.frame(maxWidth: .infinity, alignment: .leading)
.background(VColor.surface)
.clipShape(RoundedRectangle(cornerRadius: VRadius.md))
.overlay(
RoundedRectangle(cornerRadius: VRadius.md)
.stroke(VColor.surfaceBorder, lineWidth: 1)
)
.padding(.horizontal, VSpacing.sm)
.padding(.bottom, VSpacing.sm)
}
}
.buttonStyle(.plain)

if run.id != runs.last?.id {
Divider().background(VColor.surfaceBorder)
Expand Down