Hi Alain,
Following up on my promise to verify: the Zotero 10 change helps, but it turns out "dependent" is almost a no-op on macOS, so I want to share what I found since it likely explains your experience too.
I tested on Zotero 10.0.1 (macOS): the popup is indeed created with the dependent chrome flag and without always-on-top, and it no longer floats over other applications once you click another window. But it does not follow the main window when you minimize Zotero: it lingers on screen over whatever was behind, until something forces a raise. The reason is in Firefox's Cocoa widget (nsCocoaWindow.mm): addChildWindow: is only applied to popup-type windows (menus, tooltips), and the floating window level only to alwaysontop/alert windows. For a top-level chrome window like the progress popup, the dependent feature's only effect is setting the widget parent, which Cocoa then ignores. This is the same in ESR 140, ESR 153 and current mozilla-central, and it has been known upstream since 2007:
https://www.google.com/url?q=https://bugzilla.mozilla.org/show_bug.cgi?id%3D385714&source=gmail&ust=1788185868748000&sa=E (closed WORKSFORME in 2021 without an actual fix). On Windows and Linux, dependent maps to the native owner/transient relationship, so there you get both "floats above the parent" and "minimizes with it" for free; on macOS you get neither.
Your sweet spot (always on top OF Zotero, not system-wide) is exactly what addChildWindow:ordered:NSWindowAbove provides natively on macOS, so the OS supports it; it is just not wired up in Firefox for this window type. That might be worth an upstream ask, either on the Zotero side (attach the popup as a native child window on macOS) or by reopening the Bugzilla issue with a current test case.
In the meantime I fixed my half on the plugin side: ZotSeek 1.21.1 listens for the main window's sizemodechange and hides/shows the popup via nsIBaseWindow.visibility, so it now follows minimize/restore. One trap if you try the same in zotero-ocr: the visibility getter does not read back what the setter wrote, so only ever write it and track the intended state yourself.