Fix note-field space bar hijacking video, rework Outline topics as documents

- Lesson page's global keyboard shortcuts (space/arrows for play-pause/
  seek/volume) fired regardless of focus, so typing a space in the notes
  textarea toggled the video instead of typing. Now skipped entirely
  whenever a text field/select has focus.
- Outline topics no longer spawn their own top-level collection each time.
  A topic is now a document inside one fixed, user-configured collection
  (Settings -> Outline Integration -> Default collection), and a lesson's
  note becomes a child document nested under its topic - matching how
  notes actually get organized in a real Outline instance instead of
  cluttering the collections list with one per topic.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-22 12:27:00 -04:00
co-authored by Claude Sonnet 5
parent 5fe3fafc7a
commit 145f91a647
4 changed files with 168 additions and 36 deletions
+23
View File
@@ -248,6 +248,29 @@ before.
session), including Settings → Test Connection hitting the real HTTP
path.
## Outline integration follow-up fixes (this session)
- **Space bar bug**: the lesson page's global keyboard-shortcut handler
(space/arrows for play-pause/seek/volume) fired regardless of what had
focus, so typing a space in the notes textarea toggled the video instead.
Fixed with an `isTypingTarget()` guard that skips the shortcut handler
entirely when a textarea/input/select/contenteditable has focus.
- **Topic model redesign**: topics used to each spawn their own top-level
Outline *collection*. Changed so a topic is instead a *document* inside
one fixed, user-configured collection (Settings → Outline Integration →
Default collection, e.g. "Training Notes") - a lesson's note becomes a
child document nested under its topic document, matching how the user
actually organizes their real Outline instance. `list_outline_topics()`
fetches the collection's documents and filters to `parentDocumentId is
None` locally rather than trusting `documents.list`'s `collectionId`/
`parentDocumentId` request filters - both are marked deprecated in
Outline's own API spec with unclear recursive-vs-top-level semantics, so
filtering the response ourselves is the version that can't be wrong.
Verified end-to-end against a local mock Outline server: resolving a new
topic creates a top-level doc, pushing a note creates a child doc under
it, and the child never leaks back into the topic chooser as if it were
a topic itself.
## Known limitations still open
- App is unauthenticated by design (matches upstream) — settings and hidden-path
curation apply app-wide, not per-browser/per-user.