{# Inline stroke icons (24px grid, currentColor). Inline rather than an icon font or CDN sprite: reports are often reviewed on airgapped networks, and the portal's CSP allows no third-party hosts. #} {% set _ICON_PATHS = { "dashboard": "M3 3h7v9H3zM14 3h7v5h-7zM14 12h7v9h-7zM3 16h7v5H3z", "assessments": "M9 4h6a1 1 0 0 1 1 1v1H8V5a1 1 0 0 1 1-1zM8 6H6a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-2M8.5 13.5l2.5 2.5 4.5-5", "agents": "M7 7h10v10H7zM10 3v4M14 3v4M10 17v4M14 17v4M3 10h4M3 14h4M17 10h4M17 14h4", "security-architecture-review": "M12 3l9 4.5-9 4.5-9-4.5zM3 12l9 4.5 9-4.5M3 16.5l9 4.5 9-4.5", "threat-modeling": "M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18zM12 16a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM12 12h.01", "sast": "M8 7l-5 5 5 5M16 7l5 5-5 5M14 4l-4 16", "sca-reachability": "M12 3l8 4.5v9L12 21l-8-4.5v-9zM4 7.5l8 4.5 8-4.5M12 12v9", "secret-scanning": "M8 19a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM10.8 12.2L20 3M16 7l3 3M14 9l2 2", "third-party": "M4 21V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v16M16 9h3a1 1 0 0 1 1 1v11M3 21h18M8 7h4M8 11h4M8 15h4", "responsible-ai": "M12 3l1.8 5.2L19 10l-5.2 1.8L12 17l-1.8-5.2L5 10l5.2-1.8zM19 15l.8 2.2L22 18l-2.2.8L19 21l-.8-2.2L16 18l2.2-.8z", "findings": "M12 3l10 18H2zM12 10v4M12 17.5h.01", "projects": "M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z", "spend": "M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18zM15 9.5c-.5-1-1.6-1.5-3-1.5-1.7 0-3 .8-3 2s1.3 1.7 3 2 3 .8 3 2-1.3 2-3 2c-1.4 0-2.5-.5-3-1.5M12 6.5V8M12 16v1.5", "plus": "M12 5v14M5 12h14", "arrow-right": "M5 12h14M13 6l6 6-6 6", "search": "M11 18a7 7 0 1 0 0-14 7 7 0 0 0 0 14zM21 21l-5-5", "shield": "M12 3l8 3v6c0 4.5-3.4 8.3-8 9-4.6-.7-8-4.5-8-9V6zM8.5 12l2.5 2.5 4.5-5", } %} {# width/height are set on the element itself, not only in CSS, so an icon can never render at the SVG default size (it fills its container) if a stale or missing stylesheet means the CSS sizing doesn't apply. #} {% macro icon(name, cls="", stroke=1.8, size=20) -%} {%- endmacro %}