Files
vendoo/public/vendoo-icons.js
T
Masterluke77andGitHub 6f48827f4d Vendoo 1.41.2 – Git Ignore Boundary & Module Tracking Hotfix (#18)
* docs: prepare Vendoo 1.41.2 git-ignore boundary hotfix

* fix: track native source modules with root-anchored runtime ignores
2026-07-09 17:09:00 +02:00

68 lines
6.5 KiB
JavaScript

/* Vendoo Icons 1.0 — compact local SVG icon set based on Lucide geometry (ISC). */
(() => {
const ICONS = {
check: '<path d="m5 12 4 4L19 6"/>',
heart: '<path d="M20.8 4.6a5.5 5.5 0 0 0-7.8 0L12 5.7l-1.1-1.1a5.5 5.5 0 0 0-7.8 7.8l1.1 1.1L12 21l7.8-7.5 1.1-1.1a5.5 5.5 0 0 0-.1-7.8Z"/>',
'heart-filled': '<path fill="currentColor" stroke="none" d="M12 21 4.2 13.5 3.1 12.4a5.5 5.5 0 0 1 7.8-7.8L12 5.7l1-1.1a5.5 5.5 0 0 1 7.8 7.8l-1 1.1Z"/>',
pencil: '<path d="M12 20h9"/><path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L8 18l-4 1 1-4Z"/>',
mail: '<rect x="3" y="5" width="18" height="14" rx="2"/><path d="m3 7 9 6 9-6"/>',
plus: '<path d="M12 5v14M5 12h14"/>',
download: '<path d="M12 3v12"/><path d="m7 10 5 5 5-5"/><path d="M5 21h14"/>',
'trash-2': '<path d="M3 6h18"/><path d="M8 6V4h8v2"/><path d="m19 6-1 15H6L5 6"/><path d="M10 11v6M14 11v6"/>',
'zoom-in': '<circle cx="11" cy="11" r="7"/><path d="m20 20-3.5-3.5M11 8v6M8 11h6"/>',
'zoom-out': '<circle cx="11" cy="11" r="7"/><path d="m20 20-3.5-3.5M8 11h6"/>',
maximize: '<path d="M8 3H3v5M16 3h5v5M8 21H3v-5M16 21h5v-5"/>',
x: '<path d="m6 6 12 12M18 6 6 18"/>',
'triangle-alert': '<path d="m21.7 18-8-14a2 2 0 0 0-3.4 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.7-3Z"/><path d="M12 9v4M12 17h.01"/>',
sparkles: '<path d="m12 3-1.4 3.6L7 8l3.6 1.4L12 13l1.4-3.6L17 8l-3.6-1.4Z"/><path d="m19 14-.8 2.2L16 17l2.2.8L19 20l.8-2.2L22 17l-2.2-.8Z"/><path d="m5 14-.8 2.2L2 17l2.2.8L5 20l.8-2.2L8 17l-2.2-.8Z"/>',
image: '<rect x="3" y="4" width="18" height="16" rx="2"/><circle cx="8.5" cy="9" r="1.5"/><path d="m4 17 5-5 4 4 2-2 5 5"/>',
list: '<path d="M8 6h13M8 12h13M8 18h13"/><path d="M3 6h.01M3 12h.01M3 18h.01"/>',
folder: '<path d="M3 6a2 2 0 0 1 2-2h5l2 2h7a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z"/>',
'folder-open': '<path d="M3 7V6a2 2 0 0 1 2-2h5l2 2h7a2 2 0 0 1 2 2v2"/><path d="M3 10h18l-2 10H5Z"/>',
copy: '<rect x="9" y="9" width="11" height="11" rx="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/>',
'external-link': '<path d="M15 3h6v6M10 14 21 3"/><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/>',
puzzle: '<path d="M8.5 3H3v5.5a2.5 2.5 0 1 1 0 5V21h5.5a2.5 2.5 0 1 1 5 0H21v-6.5a2.5 2.5 0 1 0 0-5V3h-6.5a2.5 2.5 0 1 1-5 0Z"/>',
'shield-check': '<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10Z"/><path d="m9 12 2 2 4-4"/>',
'shield-alert': '<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10Z"/><path d="M12 8v5M12 17h.01"/>',
'alert-triangle': '<path d="m21.7 18-8-14a2 2 0 0 0-3.4 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.7-3Z"/><path d="M12 9v4M12 17h.01"/>',
'database-backup': '<ellipse cx="12" cy="5" rx="8" ry="3"/><path d="M4 5v6c0 1.7 3.6 3 8 3 1.2 0 2.4-.1 3.4-.3"/><path d="M4 11v6c0 1.7 3.6 3 8 3"/><path d="m17 17 2 2 3-4"/>',
'calendar-clock': '<path d="M8 2v4M16 2v4M3 10h18"/><rect x="3" y="4" width="18" height="17" rx="2"/><circle cx="16" cy="16" r="3"/><path d="M16 14.5V16l1 1"/>',
'scan-check': '<path d="M3 7V5a2 2 0 0 1 2-2h2M17 3h2a2 2 0 0 1 2 2v2M21 17v2a2 2 0 0 1-2 2h-2M7 21H5a2 2 0 0 1-2-2v-2"/><path d="m8 12 2.5 2.5L16 9"/>',
'package-check': '<path d="m16.5 9.4-9-5.2M21 16V8a2 2 0 0 0-1-1.7l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.7l7 4a2 2 0 0 0 2 0l3-1.7"/><path d="M3.3 7 12 12l8.7-5M12 22V12"/><path d="m17 18 2 2 3-4"/>',
'package-x': '<path d="m16.5 9.4-9-5.2M21 16V8a2 2 0 0 0-1-1.7l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.7l7 4a2 2 0 0 0 2 0l3-1.7"/><path d="M3.3 7 12 12l8.7-5M12 22V12M18 17l4 4M22 17l-4 4"/>',
'plug-zap': '<path d="m13 2-2 5h4l-2 5"/><path d="M12 12v3M8 15h8M9 19v3M15 19v3"/><path d="M7 15v2a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2v-2"/>',
'file-archive': '<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8Z"/><path d="M14 2v6h6M10 12h4M10 16h4M11 8h2"/>',
'package-open': '<path d="M12 22v-9M3.3 7 12 12l8.7-5M5 4l7 4 7-4M3 8v8a2 2 0 0 0 1 1.7l7 4a2 2 0 0 0 2 0l7-4a2 2 0 0 0 1-1.7V8"/>',
'radio-tower': '<path d="M4.9 19.1a10 10 0 0 1 0-14.2M7.8 16.2a6 6 0 0 1 0-8.4M16.2 7.8a6 6 0 0 1 0 8.4M19.1 4.9a10 10 0 0 1 0 14.2"/><circle cx="12" cy="12" r="2"/>',
'badge-check': '<path d="M12 3l2 2 3-.5 1.5 2.7L21 9l-.5 3 1.5 2.5-2.5 1.8-.5 3-3 .2-2 2.5-2-2.5-3-.2-.5-3L5 14.5 6.5 12 6 9l2.5-1.8L10 4.5Z"/><path d="m9 12 2 2 4-4"/>',
'upload-cloud': '<path d="M16 16l-4-4-4 4M12 12v9"/><path d="M20.4 17.5A5 5 0 0 0 18 8.2 7 7 0 0 0 4.3 10.8 4.5 4.5 0 0 0 5.5 19H8"/>',
'check-circle-2': '<circle cx="12" cy="12" r="10"/><path d="m9 12 2 2 4-4"/>',
'archive': '<rect x="3" y="4" width="18" height="5" rx="1"/><path d="M5 9v11h14V9M10 13h4"/>',
'refresh-cw': '<path d="M20 11a8 8 0 1 0 2 5M20 4v7h-7"/>',
'rotate-ccw': '<path d="M3 12a9 9 0 1 0 3-6.7L3 8"/><path d="M3 3v5h5"/>',
'circle-help': '<circle cx="12" cy="12" r="10"/><path d="M9.1 9a3 3 0 1 1 5.8 1c0 2-3 2-3 4"/><path d="M12 18h.01"/>',
chrome: '<circle cx="12" cy="12" r="9"/><circle cx="12" cy="12" r="3.5"/><path d="M3.8 8h8.2M8.2 20l4-8M20.2 8H12"/>',
firefox: '<path d="M5 19c-3-3-3-9 0-13 1.3-1.7 3-2.7 5-3-1 1-1.5 2.2-1.5 3.5 1.2-.7 2.5-1 3.9-.8 4.5.5 7.8 4.6 7.2 9.1-.7 4.5-4.9 7.6-9.4 6.8A9.5 9.5 0 0 1 5 19Z"/><path d="M7 16c1.2 2 4 3 6.4 2.1 2.5-.9 3.8-3.6 3-6.1-.6-1.7-2-2.8-3.6-3.2 1.2 1 .9 2.9-.4 3.6-1 .5-2.1.2-2.7-.6-1.4 1-2.4 2.5-2.7 4.2Z"/>',
compass: '<circle cx="12" cy="12" r="9"/><path d="m16 8-2.5 5.5L8 16l2.5-5.5Z"/>',
edge: '<path d="M4 15c0-6 4-11 10-11 4 0 7 2 8 5-2-1-5-1-7 0 3 0 6 2 6 6 0 4-4 7-9 7-5 0-9-3-9-7 0-3 2-5 5-6-2 2-3 4-2 6 1 3 5 4 8 2-4 1-8 0-10-2Z"/>',
};
function svg(name, options = {}) {
const size = Number(options.size || 18);
const label = options.label ? ` role="img" aria-label="${String(options.label).replace(/"/g, '&quot;')}"` : ' aria-hidden="true"';
return `<svg class="vd-icon${options.className ? ` ${options.className}` : ''}" width="${size}" height="${size}" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" focusable="false"${label}>${ICONS[name] || ICONS.image}</svg>`;
}
function render(root = document) {
root.querySelectorAll('[data-vd-icon]').forEach(node => {
const name = node.dataset.vdIcon;
const size = node.dataset.vdIconSize || 18;
node.innerHTML = svg(name, { size });
node.classList.add('vd-icon-host');
});
}
window.VendooIcons = Object.freeze({ svg, render, names: Object.keys(ICONS) });
document.addEventListener('DOMContentLoaded', () => render());
})();