From a2ad6f4d8308581b496c6787c39655d8f7a832e2 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 288a6cacb02..f1add86c978 100644 --- a/src/views/RichWorkspace.vue +++ b/src/views/RichWorkspace.vue @@ -294,11 +294,15 @@ export default { #rich-workspace:deep(.editor__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(.editor__content-wrapper) { + max-height: calc(40vh - 50px); +} + #rich-workspace:deep(.text-editor__wrapper .ProseMirror) { padding: 0px; margin: 0; From df3d8cee180c65aa31ca92c308d1650b44d080f5 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 | 34 +++++++++++++++++++ src/components/Editor.vue | 4 +-- src/views/RichWorkspace.vue | 15 ++++++-- 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/playwright/e2e/folder-description/navigate.spec.ts b/playwright/e2e/folder-description/navigate.spec.ts index 2fbab570d7f..de66262e32b 100644 --- a/playwright/e2e/folder-description/navigate.spec.ts +++ b/playwright/e2e/folder-description/navigate.spec.ts @@ -19,6 +19,40 @@ 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 .editor__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 463c2534e95..d52c8687894 100644 --- a/src/components/Editor.vue +++ b/src/components/Editor.vue @@ -758,8 +758,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 f1add86c978..aced21265d0 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 .editor__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