// Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license // Block sitemap.xml fetches triggered by Weglot's hreflang tags detected by MkDocs Material (() => { const EMPTY_SITEMAP = ``; const originalFetch = window.fetch; window.fetch = function (url, options) { if (typeof url === "string" && url.includes("/sitemap.xml")) { return Promise.resolve( new Response(EMPTY_SITEMAP, { status: 200, headers: { "Content-Type": "application/xml" } }), ); } return originalFetch.apply(this, arguments); }; const originalXHROpen = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function (method, url) { if (typeof url === "string" && url.includes("/sitemap.xml")) { this._blockRequest = true; } return originalXHROpen.apply(this, arguments); }; const originalXHRSend = XMLHttpRequest.prototype.send; XMLHttpRequest.prototype.send = function () { if (this._blockRequest) { Object.defineProperty(this, "status", { value: 200 }); Object.defineProperty(this, "responseText", { value: EMPTY_SITEMAP }); Object.defineProperty(this, "response", { value: EMPTY_SITEMAP }); Object.defineProperty(this, "responseXML", { value: new DOMParser().parseFromString(EMPTY_SITEMAP, "application/xml"), }); this.dispatchEvent(new Event("load")); return; } return originalXHRSend.apply(this, arguments); }; })(); // Apply theme colors based on dark/light mode const applyTheme = (isDark) => { document.body.setAttribute("data-md-color-scheme", isDark ? "slate" : "default"); document.body.setAttribute("data-md-color-primary", isDark ? "black" : "indigo"); }; // Sync widget theme with Material theme const syncWidgetTheme = () => { const isDark = document.body.getAttribute("data-md-color-scheme") === "slate"; document.documentElement.setAttribute("data-theme", isDark ? "dark" : "light"); }; // Check and apply appropriate theme based on system/user preference const checkTheme = () => { const palette = JSON.parse(localStorage.getItem(".__palette") || "{}"); if (palette.index === 0) { applyTheme(window.matchMedia("(prefers-color-scheme: dark)").matches); syncWidgetTheme(); } }; function syncEmbedTheme() { const isDark = document.body.getAttribute("data-md-color-scheme") === "slate"; document.querySelectorAll("iframe").forEach((iframe) => { iframe.contentWindow?.postMessage({ type: "ul-theme", theme: isDark ? "dark" : "light" }, "*"); iframe.addEventListener("load", syncEmbedTheme, { once: true }); }); } // Initialize theme handling on page load document.addEventListener("DOMContentLoaded", () => { checkTheme(); syncWidgetTheme(); syncEmbedTheme(); // Watch for system theme changes window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", checkTheme); // Watch for theme toggle changes document.getElementById("__palette_1")?.addEventListener("change", (e) => { if (e.target.checked) setTimeout(checkTheme); }); // Watch for Material theme changes and sync to widget new MutationObserver(syncWidgetTheme).observe(document.body, { attributes: true, attributeFilter: ["data-md-color-scheme"], }); // Sync embed new MutationObserver(syncEmbedTheme).observe(document.body, { attributeFilter: ["data-md-color-scheme"] }); }); // Ultralytics Chat Widget --------------------------------------------------------------------------------------------- document.addEventListener("DOMContentLoaded", () => { const ultralyticsChat = new UltralyticsChat({ welcome: { title: "Hello 👋", message: "Ask about YOLO, tutorials, training, export, deployment, or troubleshooting.", chatExamples: [ "What's new in SAM 3?", "How can I get started with YOLO26?", "How does Enterprise Licensing work?", ], searchExamples: [ "YOLO26 quickstart", "custom dataset training", "model export formats", "object detection tutorial", "hyperparameter tuning", ], }, }); const headerElement = document.querySelector(".md-header__inner"); const searchContainer = headerElement?.querySelector(".md-header__source"); if (headerElement && searchContainer) { const searchBar = document.createElement("div"); searchBar.className = "ult-header-search"; const hotkey = /Mac|iPod|iPhone|iPad/.test(navigator.platform) ? "⌘K" : "Ctrl+K"; searchBar.innerHTML = ` `; headerElement.insertBefore(searchBar, searchContainer); const defaultSearchToggle = headerElement.querySelector('label[for="__search"]'); const defaultSearchInput = document.getElementById("__search"); const defaultSearchDialog = document.querySelector(".md-search"); if (defaultSearchToggle) { defaultSearchToggle.setAttribute("aria-hidden", "true"); defaultSearchToggle.style.display = "none"; } if (defaultSearchInput) { defaultSearchInput.setAttribute("tabindex", "-1"); defaultSearchInput.setAttribute("aria-hidden", "true"); } if (defaultSearchDialog) defaultSearchDialog.style.display = "none"; searchBar.querySelector(".ult-search-button").addEventListener("click", () => { ultralyticsChat?.toggle(true, "search"); }); } }); // Fix language switcher links to preserve current page path, query string, and hash (() => { function fixLanguageLinks() { const path = location.pathname; const links = document.querySelectorAll(".md-select__link[hreflang]"); if (!links.length) return; // Derive language codes from the actual links (config-driven) const langCodes = Array.from(links) .map((link) => link.getAttribute("hreflang")) .filter(Boolean); const defaultLang = Array.from(links) .find((link) => link.getAttribute("href") === "/") ?.getAttribute("hreflang") || "en"; // Extract base path (without leading slash and language prefix) let basePath = path.startsWith("/") ? path.slice(1) : path; for (const code of langCodes) { if (code === defaultLang) continue; const prefix = `${code}/`; if (basePath === code || basePath === prefix) { basePath = ""; break; } if (basePath.startsWith(prefix)) { basePath = basePath.slice(prefix.length); break; } } // Preserve query string and hash const suffix = location.search + location.hash; // Update all language links links.forEach((link) => { const lang = link.getAttribute("hreflang"); link.href = lang === defaultLang ? `${location.origin}/${basePath}${suffix}` : `${location.origin}/${lang}/${basePath}${suffix}`; }); } // Run on load and navigation fixLanguageLinks(); if (typeof document$ !== "undefined") { document$.subscribe(() => setTimeout(fixLanguageLinks, 50)); } })();