From 6bc3bc4befce91b53d280fe5a37c09606ae5f348 Mon Sep 17 00:00:00 2001 From: Jonas Date: Mon, 18 May 2026 16:57:58 +0200 Subject: [PATCH 1/2] fix(folderDescription): fix max height in unfocused mode Fixes: #8524 Signed-off-by: Jonas --- src/views/RichWorkspace.vue | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/views/RichWorkspace.vue b/src/views/RichWorkspace.vue index c185c0325e9..171a0fa4229 100644 --- a/src/views/RichWorkspace.vue +++ b/src/views/RichWorkspace.vue @@ -294,11 +294,15 @@ export default { #rich-workspace:deep(.content-wrapper) { overflow: scroll !important; - max-height: calc(40vh - 50px); + max-height: calc(30vh - 50px); padding-left: 10px; padding-bottom: 10px; } +#rich-workspace.focus:deep(.content-wrapper) { + max-height: calc(40vh - 50px); +} + #rich-workspace:deep(.text-editor__wrapper .ProseMirror) { padding: 0px; margin: 0; From 51834d07d903c0a99117a91f9296b0fc1b9bafb2 Mon Sep 17 00:00:00 2001 From: Jonas Date: Mon, 18 May 2026 16:51:54 +0200 Subject: [PATCH 2/2] fix(folderDescription): switch to view mode on blur Also fix scroll element in focus watcher. Signed-off-by: Jonas --- .../e2e/folder-description/navigate.spec.ts | 32 +++++++++++++++++++ src/components/Editor.vue | 4 +-- src/views/RichWorkspace.vue | 15 +++++++-- 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/playwright/e2e/folder-description/navigate.spec.ts b/playwright/e2e/folder-description/navigate.spec.ts index 2fbab570d7f..473246aa0c0 100644 --- a/playwright/e2e/folder-description/navigate.spec.ts +++ b/playwright/e2e/folder-description/navigate.spec.ts @@ -19,6 +19,38 @@ test('Shows Readme.md', async ({ open, editor }) => { await expect(editor.getHeading({ name: 'Folder description' })).toBeVisible() }) +test.describe('Scroll reset on blur', () => { + test.use({ + fileContent: + '# Title\n\n' + Array(30).fill('A paragraph of text.').join('\n\n'), + }) + + test('Scrolls back to top when focus is lost', async ({ + open, + page, + editor, + }) => { + await open() + await editor.el.click() + const heading = editor.getHeading({ name: 'Title' }) + await expect(page.locator('#rich-workspace')).toHaveClass(/focus/) + await expect(heading).toBeInViewport() + + // Scroll down withhin the content wrapper + await page.locator('#rich-workspace .content-wrapper').evaluate((el) => { + el.scrollTop = 400 + }) + await expect(heading).not.toBeInViewport() + + // Blur by clicking outside the workspace + await page + .getByRole('navigation', { name: 'Current directory path' }) + .click() + await expect(page.locator('#rich-workspace')).not.toHaveClass(/focus/) + await expect(heading).toBeInViewport() + }) +}) + test('Hides in a different folder', async ({ editor, open, page, user }) => { await createFolder({ name: 'Other folder', owner: user }) await open() diff --git a/src/components/Editor.vue b/src/components/Editor.vue index 9af06660532..addf31aa44e 100644 --- a/src/components/Editor.vue +++ b/src/components/Editor.vue @@ -646,8 +646,8 @@ export default defineComponent({ this.emit('focus') }, - onBlur() { - this.emit('blur') + onBlur({ event }) { + this.emit('blur', event) }, onKeyboardSave() { diff --git a/src/views/RichWorkspace.vue b/src/views/RichWorkspace.vue index 171a0fa4229..d416fb161af 100644 --- a/src/views/RichWorkspace.vue +++ b/src/views/RichWorkspace.vue @@ -25,7 +25,8 @@ active rich-workspace @ready="ready = true" - @focus="onFocus" /> + @focus="onFocus" + @blur="onBlur" /> @@ -112,8 +113,8 @@ export default { focus(newValue) { if (!newValue) { document - .querySelector('#rich-workspace .text-editor__main') - .scrollTo(0, 0) + .querySelector('#rich-workspace .content-wrapper') + ?.scrollTo(0, 0) } }, shouldRender(value) { @@ -150,6 +151,14 @@ export default { this.hideMenu = false this.unlistenKeydownEvents() }, + onBlur(event) { + // If focus moved to something inside the workspace (e.g. menubar), don't collapse + if (this.$el.contains(event?.relatedTarget)) { + return + } + this.focus = false + this.hideMenu = true + }, reset() { this.file = null this.focus = false