fix(hub): stop instance iframe nav flash after account status badge

Load account_risk_badge.css before body paint, skip redundant hub theme re-apply, remove iframe hide overlay, and disable badge transitions in hub embed.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-17 19:36:48 +08:00
parent 6520234bd8
commit d8dccb8606
9 changed files with 48 additions and 75 deletions
+18 -21
View File
@@ -63,6 +63,7 @@
}
let _linkedTheme = null;
let _appliedTheme = null;
function get() {
if (isHubLinked()) {
@@ -191,13 +192,25 @@
const options = opts || {};
const linked = isHubLinked();
const t = normalize(theme);
const root = document.documentElement;
const unchanged =
!options.force &&
_appliedTheme === t &&
root.getAttribute("data-theme") === t;
if (unchanged) {
return t;
}
_appliedTheme = t;
if (linked) {
_linkedTheme = t;
writeLinkedThemeStorage(t);
} else if (!options.skipStore) {
root.setAttribute("data-hub-linked", "1");
} else {
root.removeAttribute("data-hub-linked");
}
if (!linked && !options.skipStore) {
setStandalone(t);
}
const root = document.documentElement;
root.setAttribute("data-theme", t);
const meta = document.querySelector('meta[name="theme-color"]');
if (meta) meta.setAttribute("content", META[t]);
@@ -283,20 +296,6 @@
apply(data.theme, { skipStore: true });
}
function notifyParentFrameNavStart() {
if (!isHubLinked()) return;
try {
window.parent.postMessage({ type: "instance-frame-navigating", theme: get() }, "*");
} catch (_) {}
}
function notifyParentFrameReady() {
if (!isHubLinked()) return;
try {
window.parent.postMessage({ type: "instance-frame-ready" }, "*");
} catch (_) {}
}
/** 中控 iframe 内:拦截顶栏导航,fetch 后 document.write 原地换页,避免 iframe 卸载白屏 */
function initHubEmbedInFrameNav() {
if (!isHubLinked()) return;
@@ -310,7 +309,6 @@
async function navigateInFrame(href, opts) {
const token = ++navToken;
notifyParentFrameNavStart();
try {
const r = await fetch(href, { credentials: "same-origin" });
if (token !== navToken) return;
@@ -320,9 +318,6 @@
}
const html = await r.text();
if (token !== navToken) return;
document.open();
document.write(html);
document.close();
let path = href;
try {
const u = new URL(href, location.href);
@@ -330,6 +325,9 @@
} catch (_) {}
if (opts && opts.replace) history.replaceState(null, "", path);
else history.pushState(null, "", path);
document.open();
document.write(html);
document.close();
} catch (_) {
if (token === navToken) location.href = href;
}
@@ -368,7 +366,6 @@
apply(get(), { skipStore: true });
window.addEventListener("message", (ev) => initFromHubMessage(ev.data));
initHubEmbedInFrameNav();
notifyParentFrameReady();
try {
window.parent.postMessage({ type: "instance-theme-ready" }, "*");
} catch (_) {}