{# Macro toast Uso: {% from "core/components/toast.html" import toast %} {{ toast("Guardado", level="success") }} level: info | success | warning | danger (error = danger) Se auto-elimina tras data-dismiss-after ms (static/js/toasts.js; 0 = no). Mismo marcado que window.dgToast() y que el aviso de error de htmx. Sin role propio: #dg-toasts ya es aria-live y una región anidada se anuncia dos veces. #} {% from "core/components/icon.html" import icon as _icon %} {% set _TOAST_TONES = {"success": "success", "info": "info", "warning": "warning", "danger": "danger", "error": "danger"} %} {% set _TOAST_ICONS = {"success": "circle-check", "info": "info"} %} {% macro toast(message, level="info", dismiss_after=5000) %} {%- set _tone = _TOAST_TONES.get(level, "info") %}
{{ _icon(_TOAST_ICONS.get(level, "circle-alert")) }} {{ message }} {# Sin toasts.js (host con layout propio) el botón sigue cerrando, sin fundido. #}
{%- endmacro %} {# Wrapper-region donde HTMX puede inyectar toasts con hx-swap-oob="beforeend". El container usa inset-x-4 en mobile para no desbordarse en viewports 375px, y en sm+ se ancla a la esquina inferior-derecha como siempre. NO usar con `core/layouts/sidebar_shell.html` ni `empty.html`: esos layouts ya montan su propio `#dg-toasts`. Dos `#dg-toasts` en la página harían que los OOB swaps caigan en el primer match (id duplicado). Solo para hosts con layout propio que no lo definan. #} {% macro toast_region() %}
{%- endmacro %}