function createActivityProgress({ MODAL_ID, environment }) { const { document, setTimeout, clearTimeout, matchMedia } = environment; const entries = new Map(); function update(key, state, completed = 0, total = null) { const host = document?.querySelector?.(`#${MODAL_ID} .opportunities-extension-subtitle-row`); if (!host) return; let entry = entries.get(key); if (!entry) { const badge = document.createElement("span"); badge.className = "opportunities-extension-products-progress"; badge.setAttribute("role", "status"); badge.setAttribute("aria-live", "polite"); host.append(badge); entry = { badge, timer: null, hideTimer: null, state: "idle" }; entries.set(key, entry); } if (state === "complete" && entry.state === "complete") return; clearTimeout(entry.timer); clearTimeout(entry.hideTimer); entry.state = state; const label = key === "session" ? "SR session" : key === "sr" ? "Service Requests" : "Actions"; entry.badge.hidden = state === "idle"; entry.badge.setAttribute("data-state", state); entry.badge.setAttribute("data-fading", "false"); entry.badge.setAttribute("aria-busy", String(state === "running")); const count = total === null ? String(completed) : `${completed}/${total}`; entry.badge.textContent = state === "error" ? `${label} unavailable` : state === "complete-with-errors" ? `${label} ${count} (errors)` : state === "complete" ? `${label} ready ${completed}` : `${label} ${count}`; if (key === "session") entry.badge.textContent = state === "complete" ? "SR session ready" : state === "error" ? "SR session unavailable" : "SR session loading"; entry.badge.title = key === "session" ? "Service Request session initialization" : key === "sr" ? "CRM service request records loaded" : "Product workloads checked for Actions in the selected Reference, regardless of display filters"; if (state === "complete") entry.timer = setTimeout(() => { entry.badge.setAttribute("data-fading", "true"); const reduced = typeof matchMedia === "function" && matchMedia("(prefers-reduced-motion: reduce)").matches; entry.hideTimer = setTimeout(() => { entry.badge.hidden = true; }, reduced ? 0 : 300); }, 5000); } return { update }; }