ulysses/static/js
Collin Osborne 471ee494f0 fix: make transient dropdown/popup menus close on Escape
The global Escape arbiter in ui.js only sees `.modal` elements, so the many
ad-hoc dropdowns and context popups that are built on the fly and appended to
<body> ignored Escape entirely: document-library card/chat menus, chat
context/stats/overflow popups, cookbook serve & running menus, calendar event
menus, and compare pane menus.

Add a small DOM-free dismissal registry (static/js/escMenuStack.js). Menus
register a dismiss callback while open, and the arbiter closes the
most-recently-opened one first, so a menu opened over a modal closes before the
modal. bindMenuDismiss() wires the ubiquitous "append-to-body, close on outside
click" idiom to both the outside-click listener and the Escape stack in one
call, and dismissOrRemove() lets the pre-existing bulk removers (scroll/swipe/
modal-dismiss cleanup, reopen sweeps) tear a menu down through its real teardown
instead of orphaning its stack entry.

Covers ~14 menus across documentLibrary, chatRenderer, cookbookServe,
cookbookRunning, calendar, and compare/panes. Every teardown path — item click,
outside click, swipe, toggle, rebuild, bulk cleanup — routes through the
registry so no entry is ever stranded.

tests/test_esc_menu_stack_js.py pins the registry's LIFO and
exactly-one-per-press guarantees (node-driven; skips when node is absent).
2026-06-01 14:23:22 -04:00
..
calendar Odysseus v1.0 2026-05-31 23:58:26 +09:00
compare fix: make transient dropdown/popup menus close on Escape 2026-06-01 14:23:22 -04:00
editor feat(ai): add OpenRouter and Ollama Cloud providers (#231) 2026-06-01 14:26:10 +09:00
emailLibrary Keep Cc recipients in reply-all 2026-06-01 18:29:22 +09:00
research feat(ai): add OpenRouter and Ollama Cloud providers (#231) 2026-06-01 14:26:10 +09:00
admin.js feat(ai): add OpenRouter and Ollama Cloud providers (#231) 2026-06-01 14:26:10 +09:00
assistant.js feat(ai): add OpenRouter and Ollama Cloud providers (#231) 2026-06-01 14:26:10 +09:00
calendar.js fix: make transient dropdown/popup menus close on Escape 2026-06-01 14:23:22 -04:00
censor.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
chat.js Fix chat stream recovery and PDF library indexing (#468) 2026-06-01 22:33:35 +09:00
chatRenderer.js fix: make transient dropdown/popup menus close on Escape 2026-06-01 14:23:22 -04:00
chatStream.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
codeRunner.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
colorPicker.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
cookbook-diagnosis.js Clarify Cookbook diffusion dependencies 2026-06-01 11:45:26 +09:00
cookbook-hwfit.js fix: require GGUF sources for llama downloads (#368) 2026-06-01 22:47:47 +09:00
cookbook.js fix: report serve dependency readiness (#412) 2026-06-01 22:39:36 +09:00
cookbookDownload.js fix: require GGUF sources for llama downloads (#368) 2026-06-01 22:47:47 +09:00
cookbookRunning.js fix: make transient dropdown/popup menus close on Escape 2026-06-01 14:23:22 -04:00
cookbookServe.js fix: make transient dropdown/popup menus close on Escape 2026-06-01 14:23:22 -04:00
document.js Polish email tasks and window controls 2026-06-01 20:56:46 +09:00
documentLibrary.js fix: make transient dropdown/popup menus close on Escape 2026-06-01 14:23:22 -04:00
dragSort.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
emailInbox.js Polish email reply and task controls 2026-06-01 23:02:25 +09:00
emailLibrary.js Polish email reply and task controls 2026-06-01 23:02:25 +09:00
emojiPicker.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
escMenuStack.js fix: make transient dropdown/popup menus close on Escape 2026-06-01 14:23:22 -04:00
fileHandler.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
gallery.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
galleryEditor.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
group.js Await character templates before populating group dropdowns 2026-06-01 15:18:32 +09:00
init.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
keyboard-shortcuts.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
langIcons.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
markdown.js Respect text-only emoji setting after svgification 2026-06-01 15:41:27 +09:00
memory.js feat: allow memory import without session (#493) 2026-06-01 22:32:17 +09:00
modalManager.js fix: make transient dropdown/popup menus close on Escape 2026-06-01 14:23:22 -04:00
modalSnap.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
modelPicker.js feat(ai): add OpenRouter and Ollama Cloud providers (#231) 2026-06-01 14:26:10 +09:00
models.js feat(ai): add OpenRouter and Ollama Cloud providers (#231) 2026-06-01 14:26:10 +09:00
modelSort.js feat(ai): add OpenRouter and Ollama Cloud providers (#231) 2026-06-01 14:26:10 +09:00
MODULE_SUMMARY.md Odysseus v1.0 2026-05-31 23:58:26 +09:00
notes.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
presets.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
providers.js feat(ai): add OpenRouter and Ollama Cloud providers (#231) 2026-06-01 14:26:10 +09:00
rag.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
researchSynapse.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
search-chat.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
search.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
section-management.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
sessions.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
settings.js Polish email tasks and window controls 2026-06-01 20:56:46 +09:00
sidebar-layout.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
signature.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
skills.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
slashCommands.js feat(ai): add OpenRouter and Ollama Cloud providers (#231) 2026-06-01 14:26:10 +09:00
spinner.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
storage.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
tasks.js Polish email reply and task controls 2026-06-01 23:02:25 +09:00
theme.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
tileManager.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
tourAutoplay.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
tourHints.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
tts-ai.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
ui.js fix: make transient dropdown/popup menus close on Escape 2026-06-01 14:23:22 -04:00
voiceRecorder.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
windowDrag.js Odysseus v1.0 2026-05-31 23:58:26 +09:00