feat(main): anchor dialog by inserting before gymContentWrapper (dock in page flow)

This commit is contained in:
dev
2026-06-07 12:15:09 -05:00
parent a1e79ac801
commit ca83996c6e
+10 -17
View File
@@ -4,20 +4,20 @@ import { currentAttribute } from './dom.js';
import { startRequestInterceptor } from './interceptor.js';
function findAnchorElement() {
// Try several selectors in priority order. Torn's gym page renders the
// training UI as <ul class="properties___HASH"> (the list of attribute
// rows). Anchor the dialog above that list.
// Return the element to insert the dialog BEFORE in the DOM.
// The user wants the dialog between the notification wrapper and the
// gym content wrapper; we insert before gymContentWrapper.
const candidates = [
'ul[class*="properties"]',
'[class*="gymContent"]',
'[class*="gymContentWrapper"]',
// Legacy fallbacks (kept in case Torn ever wraps the list in a form):
'[class*="gymContentWrapper"]', // outer wrapper — best insertion point
'[class*="gymContent"]', // inner wrapper (fallback)
'ul[class*="properties"]', // the list itself (last resort)
// Legacy fallbacks (kept for robustness):
'form[action*="train"]',
'form.train-form',
'form[class*="train"]',
'[class*="train-button"]',
'button[class*="train"]',
'a[class*="train"]',
'a[href*="train"]',
'button[name="train"]',
'a[href*="train"]',
];
@@ -99,20 +99,13 @@ function start() {
if (prefs.mode === 'anchored') {
const el = findAnchorElement();
if (el) {
const rect = el.getBoundingClientRect();
dialog.setMode('anchored', { canAnchor: true, rect: rect });
if (typeof ResizeObserver !== 'undefined') {
const ro = new ResizeObserver(function () {
if (prefs.mode === 'anchored') dialog._positionAnchored(el.getBoundingClientRect());
});
ro.observe(el);
}
dialog.setMode('anchored', { canAnchor: true, insertBefore: el });
anchorError = null;
return;
}
// Anchor selector missed — don't snap to default, just keep current
// position and show a note.
anchorError = "Couldn't find the training form on this page.";
anchorError = "Couldn't find the training UI on this page.";
render();
return;
}