Skip to content

Release 1.2.1: README rewrite, popover scroll fix, and post-RMQ cleanup#29

Merged
onemli merged 1 commit into
mainfrom
release/1.2.1
May 26, 2026
Merged

Release 1.2.1: README rewrite, popover scroll fix, and post-RMQ cleanup#29
onemli merged 1 commit into
mainfrom
release/1.2.1

Conversation

@onemli
Copy link
Copy Markdown
Owner

@onemli onemli commented May 26, 2026

Three things in one release, all small, all independent:

README rewrite

The previous README leaned on marketing-style summaries and three layered architecture sections that nobody scrolled to. The rewrite trims that down: a short "Why this exists" paragraph that talks about the actual operator pain (the moquery folder, the Postman collection, the spreadsheets), a tighter "What it does" list with five concrete categories, a four-command quickstart, and a single architecture image with a stack table. About a third shorter overall.

Popover scroll fix

The package picker that opens from the Class Browser dialog had a broken mouse-wheel scroll. Drag worked, wheel didn't.

Root cause was a layering issue between two libraries:

  1. Radix Dialog (which ClassBrowserDialog uses) wraps its content in react-remove-scroll. That installs a document-level wheel event listener and calls preventDefault() on wheel events targeting anything outside the dialog's content subtree or its shards array.
  2. Radix Popover Content (which PackageCombobox uses, via the shadcn wrapper) is rendered through PopoverPrimitive.Portal into document.body. That puts the popover body outside the dialog's content DOM and outside its shards.
  3. Wheel events fired on the popover list therefore got caught by the dialog's removal-scroll listener and cancelled before browser-native scroll could kick in.

The shadcn popover.tsx wrapper now accepts an opt-in withoutPortal prop. PackageCombobox uses it so the popover renders inline inside the dialog content, which makes the dialog's scroll lock recognise it as a child and let wheel events through. Other call sites of PopoverContent are unaffected because the prop defaults to false.

Frontend cleanup

services/ai.ts carried three stubs (generateQuery, getSuggestions, submitFeedback) that posted to backend endpoints which were never wired up (/api/ai/generate/, /generate/suggest/, /generate/feedback/). The only callers were the matching test cases. Removed both. Five orphan response types (AIGenerateResponse, AISuggestResponse, AIGeneratedNode/Filter/Edge) went with them.

Also dropped three stale "advisor" mentions in the loader_v2 docstring that referred to a feature that was never built.

Architecture diagram

frontend/src/assets/architecture.mmd is updated to match the post-RMQ topology (no event-bus node, AWX webhook arrow points at the backend, separate edge for the 30-second beat poll). The rendered SVG is committed alongside the source so the repo stays self-consistent with what docs.fabrikops.com serves.

Verification

  • TypeScript: npx tsc --noEmit clean
  • Popover fix: tested in Class Browser dialog with the rebuilt frontend container; mouse wheel scrolls the "All packages (A–Z)" list as expected
  • README rendered correctly on GitHub preview

README has been rewritten with a tighter structure and a more direct
tone. The architecture section now relies on the diagram instead of
restating it in prose.

The package picker that opens from the Class Browser dialog had a
broken mouse-wheel scroll. Root cause: the popover content was being
rendered through a portal into document.body, which sat outside the
parent dialog's scroll-lock allow-list (Radix Dialog wraps its content
in react-remove-scroll, which installs a document-level wheel listener
and blocks wheel events on anything not inside its content subtree or
shards). The shadcn popover wrapper now accepts an opt-in 'withoutPortal'
prop, and the package combobox uses it so the popover renders inline
inside the dialog content — where the dialog's scroll lock recognises
it as a child and lets wheel events through.

Three stubs in services/ai.ts (generateQuery, getSuggestions,
submitFeedback) posted to backend endpoints that were never
implemented. Nothing in production code was calling them. Removed
the stubs along with their test cases and the unused response types.
Also cleaned up three stale 'advisor' mentions in the loader_v2
docstring, which referred to a feature that was never built.

Architecture diagram source (architecture.mmd) and the rendered SVG
are committed to keep the repo self-consistent with what
docs.fabrikops.com serves.
@onemli onemli merged commit 7c55e12 into main May 26, 2026
6 checks passed
@onemli onemli deleted the release/1.2.1 branch May 26, 2026 22:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant