42 lines
3.8 KiB
JavaScript
42 lines
3.8 KiB
JavaScript
// Загрузчик спрайта иконок ДС KT AI (наложение платформы Vibe AI).
|
||
// Внешний <use href="sprite.svg#home"> браузеры блокируют, поэтому спрайт вставляется в документ:
|
||
// <script src="design-system/icons/kt-ai-icons.js"></script>
|
||
// <svg class="kt-icon" aria-hidden="true"><use href="#home"></use></svg>
|
||
// Путь к спрайту берётся рядом со скриптом; переопределить: data-sprite="/icons.svg".
|
||
(function () {
|
||
var s = document.currentScript;
|
||
var url = (s && s.getAttribute("data-sprite")) || (s ? s.src.replace(/[^/]*$/, "kt-ai-lucide-sprite.svg") : "design-system/icons/kt-ai-lucide-sprite.svg");
|
||
// Модель иногда берёт «обычные» имена Lucide, которых в спрайте ДС нет: подменяем ближайшими, чтобы иконка не была пустой.
|
||
var ALIAS = { shield: "lock", "shield-check": "check-circle", headset: "help", headphones: "help", phone: "megaphone", "phone-call": "megaphone",
|
||
star: "trophy", award: "trophy", medal: "trophy", heart: "check-circle", "thumbs-up": "check-circle", globe: "external", wifi: "sync", signal: "chart",
|
||
server: "database", cloud: "layers", cpu: "tool", zap: "sparkles", bolt: "sparkles", target: "lightbulb", briefcase: "building", "map-pin": "pin",
|
||
"shopping-cart": "package", "credit-card": "receipt", wallet: "receipt", truck: "package", "bar-chart": "chart", "bar-chart-2": "chart", "pie-chart": "chart",
|
||
activity: "chart", "trending-up": "arrowUpDown", "line-chart": "chart", "message-circle": "chat", "message-square": "chat", smartphone: "tool",
|
||
monitor: "dashboard", laptop: "dashboard", "check-square": "checklist", "file-text": "file", "folder": "archive", image: "eye", camera: "eye",
|
||
"user-check": "user", "user-plus": "users", "users-2": "users", "log-out": "logout", "log-in": "arrowRight", "arrow-up-right": "external",
|
||
"chevron-up": "chevronDown", key: "lock", "alert-triangle": "warning", "x-circle": "x", "help-circle": "help", "info-circle": "info", "circle-check": "check-circle" };
|
||
function fixUses(root) {
|
||
var uses = (root || document).querySelectorAll('use[href^="#"]');
|
||
for (var i = 0; i < uses.length; i++) {
|
||
var id = uses[i].getAttribute("href").slice(1);
|
||
if (!id || document.getElementById(id)) continue;
|
||
var alt = ALIAS[id] || ALIAS[id.toLowerCase()] || "layers";
|
||
if (document.getElementById(alt)) { uses[i].setAttribute("href", "#" + alt); console.warn("[kt-ai-icons] иконки «" + id + "» нет в спрайте ДС, показана «" + alt + "» — поправь имя по списку в design.md"); }
|
||
}
|
||
}
|
||
function inject(svgText) {
|
||
if (document.getElementById("kt-ai-sprite")) { fixUses(); return; }
|
||
var box = document.createElement("div");
|
||
box.id = "kt-ai-sprite"; box.setAttribute("aria-hidden", "true");
|
||
box.style.cssText = "position:absolute;width:0;height:0;overflow:hidden";
|
||
box.innerHTML = svgText;
|
||
(document.body || document.documentElement).insertBefore(box, (document.body || document.documentElement).firstChild);
|
||
fixUses();
|
||
if (window.MutationObserver) new MutationObserver(function () { fixUses(); }).observe(document.documentElement, { childList: true, subtree: true });
|
||
}
|
||
var ready = fetch(url, { credentials: "same-origin" }).then(function (r) { if (!r.ok) throw new Error("sprite " + r.status); return r.text(); })
|
||
.then(function (t) { if (document.body) inject(t); else document.addEventListener("DOMContentLoaded", function () { inject(t); }); })
|
||
.catch(function (e) { console.warn("[kt-ai-icons] спрайт не загрузился:", e && e.message); });
|
||
window.KTIcons = { ready: ready, url: url };
|
||
})();
|