WorkFlowy - Focus Fix

Fix WorkFlowy lost focus

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         WorkFlowy - Focus Fix
// @description  Fix WorkFlowy lost focus
// @author       rawbytz and Gavin Elster
// @version      2026.04.12
// @license      MIT
//
// @namespace    https://github.com/elstgav
// @homepageURL  https://github.com/elstgav/workflowy
// @supportURL   https://github.com/elstgav/workflowy/issues
//
//
// @match        https://workflowy.com/*
//
// @grant        none
// @run-at       document-end
// ==/UserScript==

//#region src/scripts/focus-fix/focus-fix.ts
const fixFocus = () => {
  const active = document.activeElement?.className
  if (!active || active.includes('searchBoxInput') || active.includes('content')) return
  const matches = document.querySelectorAll(
    '.name.matches .content, .notes.matches .content, .metaMatches .name .content',
  )
  if (matches[0] instanceof HTMLElement) return matches[0].focus()
  const index = WF.currentItem().isMainDocumentRoot() && !WF.currentSearchQuery() ? 2 : 0
  const content = document.getElementsByClassName('content')
  if (content[index] instanceof HTMLElement) content[index].focus()
}
const otherListeners = WFEventListener
window.WFEventListener = (event) => {
  if (event !== 'locationChanged') return
  requestAnimationFrame(fixFocus)
  otherListeners?.(event)
}
const appObserver = new MutationObserver(() => {
  if (!document.querySelector('.page.active')) return
  appObserver.disconnect()
  fixFocus()
})
appObserver.observe(document.body, {
  subtree: true,
  childList: true,
})
//#endregion