Merge branch 'stack-preview' into stack-reconcile

# Conflicts:
#	src/renderer/src/components/editor/editor-panel-render-model.ts
This commit is contained in:
Neil
2026-09-18 19:34:45 -07:00
4 changed files with 17 additions and 12 deletions
@@ -10,7 +10,11 @@ vi.mock('./EditorPanelHeader', () => ({
}))
vi.mock('./EditorContent', () => ({
EditorContent: () => <div data-editor-content />
EditorContent: ({ onOpenMarkdownPreview }: { onOpenMarkdownPreview?: () => void }) => (
<div data-editor-content>
{onOpenMarkdownPreview && <button onClick={onOpenMarkdownPreview}>Open preview</button>}
</div>
)
}))
vi.mock('./UntitledFileRenameDialog', () => ({
@@ -48,7 +52,7 @@ function renderShell(file: OpenFile, isCombinedDiff = false): string {
availableEditorToggleModes: [],
effectiveToggleValue: 'edit',
canOpenPreviewToSide: false,
canShowMarkdownPreview: false,
canShowMarkdownPreview: file.language === 'markdown' && file.mode === 'edit',
canShowMarkdownTableOfContents: false,
isMarkdownTableOfContentsDisabled: false,
shouldShowMarkdownExportAction: false,
@@ -122,3 +126,9 @@ describe('EditorPanelShell path header', () => {
expect(renderShell(openFile('edit'))).toContain('data-editor-content')
})
})
it('offers Markdown preview through the shell even when HTML side preview is unavailable', () => {
const file = { ...openFile('edit'), language: 'markdown' }
expect(renderShell(file)).toContain('Open preview')
expect(renderShell(openFile('edit'))).not.toContain('Open preview')
})
@@ -163,7 +163,7 @@ export function EditorPanelShell({
showMarkdownFrontmatter={markdownFrontmatterVisible}
onCloseMarkdownTableOfContents={onCloseMarkdownTableOfContents}
markdownAnnotationsEnabled={markdownAnnotationsEnabled}
onOpenMarkdownPreview={model.canOpenPreviewToSide ? onOpenMarkdownPreview : undefined}
onOpenMarkdownPreview={model.canShowMarkdownPreview ? onOpenMarkdownPreview : undefined}
/>
</Suspense>
<UntitledFileRenameDialog
@@ -306,10 +306,11 @@ describe('getEditorPanelRenderModel markdown export affordance', () => {
})
})
it('hides disk preview while a fallback draft is unsaved', () => {
it('offers the live Markdown preview while a fallback draft is unsaved', () => {
const model = renderModel({
editorDrafts: { '/repo/README.md': '[reference]: https://example.com' }
})
expect(model.availableEditorToggleModes).not.toContain('preview')
expect(model.availableEditorToggleModes).toContain('preview')
expect(model.canShowMarkdownPreview).toBe(true)
expect(model.canOpenPreviewToSide).toBe(false)
})
@@ -144,16 +144,11 @@ export function getEditorPanelRenderModel({
richModeEligibility !== null
? richModeEligibility.exceedsSizeLimit || richModeUnsupportedMessage !== null
: richModeFaultedForCurrentContent
const hasUnsavedMarkdownDraft =
viewerLanguage === 'markdown' &&
activeFile.mode === 'edit' &&
editorDrafts[activeFile.id] !== undefined &&
editorDrafts[activeFile.id] !== inlineFileContent?.content
const editorToggleModes = getEditorToggleModes({
language: viewerLanguage,
mode: activeFile.mode,
diffSource: activeFile.diffSource,
richModeFallsBackToSource: richModeFallsBackToSource && !hasUnsavedMarkdownDraft
richModeFallsBackToSource
})
const availableEditorToggleModes =
isBinaryEditSurface || !canUseChangesModeForFile(activeFile)
@@ -205,7 +200,6 @@ export function getEditorPanelRenderModel({
// files and commit diffs whose content may not match the working tree).
canOpenPreviewToSide:
canOpenWorkspaceFileBrowser &&
!hasUnsavedMarkdownDraft &&
canPreviewLanguage(viewerLanguage) &&
(activeFile.mode === 'edit' || (isSingleDiff && openFileState.canOpen)),
mdViewMode,