Use outline variant for merge abort buttons

Change the abort action button variant for merge operations from destructive
to outline, aligning it with rebase abort. This uses a quieter,
non-destructive treatment for aborting operations.
This commit is contained in:
Jinjing
2026-06-11 19:43:47 -07:00
parent bf9a542d4f
commit 8af29892da
2 changed files with 24 additions and 16 deletions
@@ -384,8 +384,18 @@ describe('ConflictSummaryCard', () => {
expect(cherryPickMarkup).not.toContain('Abort rebase')
})
it('renders rebase abort with the quiet outline review-conflicts button treatment', () => {
const markup = renderToStaticMarkup(
it('renders abort actions with the quiet outline review-conflicts button treatment', () => {
const mergeMarkup = renderToStaticMarkup(
<ConflictSummaryCard
conflictOperation="merge"
unresolvedCount={1}
isResolvingWithAI={false}
onAbortOperation={vi.fn()}
onResolveWithAI={vi.fn()}
onReview={vi.fn()}
/>
)
const rebaseMarkup = renderToStaticMarkup(
<ConflictSummaryCard
conflictOperation="rebase"
unresolvedCount={1}
@@ -396,8 +406,10 @@ describe('ConflictSummaryCard', () => {
/>
)
expect(buttonContaining(markup, 'Review conflicts')).toContain('data-variant="outline"')
expect(buttonContaining(markup, 'Abort rebase')).toContain('data-variant="outline"')
expect(buttonContaining(mergeMarkup, 'Review conflicts')).toContain('data-variant="outline"')
expect(buttonContaining(mergeMarkup, 'Abort merge')).toContain('data-variant="outline"')
expect(buttonContaining(rebaseMarkup, 'Review conflicts')).toContain('data-variant="outline"')
expect(buttonContaining(rebaseMarkup, 'Abort rebase')).toContain('data-variant="outline"')
})
it('renders the Sparkles icon on the idle Resolve with AI button', () => {
@@ -435,7 +447,7 @@ describe('OperationBanner', () => {
expect(cherryPickMarkup).not.toContain('Abort rebase')
})
it('keeps rebase abort non-destructive while preserving merge abort styling', () => {
it('renders abort actions with the quiet outline button treatment', () => {
const mergeMarkup = renderToStaticMarkup(
<OperationBanner conflictOperation="merge" onAbortOperation={vi.fn()} />
)
@@ -443,7 +455,7 @@ describe('OperationBanner', () => {
<OperationBanner conflictOperation="rebase" onAbortOperation={vi.fn()} />
)
expect(buttonContaining(mergeMarkup, 'Abort merge')).toContain('data-variant="destructive"')
expect(buttonContaining(mergeMarkup, 'Abort merge')).toContain('data-variant="outline"')
expect(buttonContaining(rebaseMarkup, 'Abort rebase')).toContain('data-variant="outline"')
})
})
@@ -5687,14 +5687,6 @@ function DiffCommentsInlineList({
)
}
function conflictAbortButtonVariant(
conflictOperation: GitConflictOperation
): 'outline' | 'destructive' {
// Why: aborting a rebase is the escape hatch for this state, so it should
// match the quiet outline conflict-review action instead of reading as red.
return conflictOperation === 'rebase' ? 'outline' : 'destructive'
}
export function ConflictSummaryCard({
conflictOperation,
unresolvedCount,
@@ -5770,7 +5762,9 @@ export function ConflictSummaryCard({
{(conflictOperation === 'merge' || conflictOperation === 'rebase') && onAbortOperation ? (
<Button
type="button"
variant={conflictAbortButtonVariant(conflictOperation)}
// Why: abort is the escape hatch for this state, so match the quiet
// outline conflict-review action instead of reading as destructive.
variant="outline"
size="sm"
className="mt-1.5 h-7 w-full text-xs"
disabled={isResolvingWithAI || isAbortingOperation}
@@ -5821,7 +5815,9 @@ export function OperationBanner({
{(conflictOperation === 'merge' || conflictOperation === 'rebase') && onAbortOperation ? (
<Button
type="button"
variant={conflictAbortButtonVariant(conflictOperation)}
// Why: abort is the escape hatch for this state, so match the quiet
// outline conflict-review action instead of reading as destructive.
variant="outline"
size="sm"
className="mt-2 h-7 w-full text-xs"
disabled={isAbortingOperation}