--- name: toast kind: component lang: cpp domain: core version: "1.1.0" purity: impure signature: "void fn_ui::toast_push(ToastKind kind, const char* text); void fn_ui::toast_render(); void fn_ui::toast_inbox_button(const char* id); int fn_ui::toast_unread_count(); void fn_ui::toast_history_clear()" description: "Notificaciones efimeras apiladas en esquina inferior + inbox con campana (badge no-leidos) y popover con historial (50 entradas)" tags: [imgui, toast, notification, ui, tokens] uses_functions: ["tokens_cpp_core"] uses_types: [] returns: [] returns_optional: false error_type: "" imports: [imgui] tested: false tests: [] test_file_path: "" file_path: "cpp/functions/core/toast.cpp" framework: imgui params: - name: kind desc: "ToastKind: Info (azul), Success (verde), Warning (amarillo), Error (rojo)" - name: text desc: "Mensaje. Se copia internamente, el caller no necesita mantenerlo vivo" output: "toast_push encola un toast; toast_render renderiza todos los activos (llamar una vez por frame)" --- # toast Sistema global de notificaciones efimeras. Duracion ~3.5s con fade-out. Cola thread-safe (std::mutex) — se puede hacer push desde callbacks async. ## Patron ```cpp // 1) Push desde cualquier handler (tras terminar una operacion): fn_ui::toast_push(fn_ui::ToastKind::Success, "Reindexed 881 functions"); // 2) Render una vez por frame en el bucle principal, DESPUES del contenido: // (asi los toasts se superponen a ventanas y modales) render_dashboard(); fn_ui::toast_render(); ``` ## Inbox (v1.1) Los toasts empujados tambien se guardan en un historial de 50 entradas. `toast_inbox_button(id)` dibuja un boton con icono de campana y un badge rojo con el numero de no-leidos; al hacer click abre un popover con el historial ordenado por fecha (mas reciente arriba) y un boton "Clear". ```cpp // En la toolbar, al lado de Reindex/Add/Reload: fn_ui::toast_inbox_button("##inbox"); ``` El `id` debe ser unico si tienes varios botones (raro). Al abrir el popover se marcan todos como leidos (el badge desaparece hasta el siguiente `toast_push`). ## Notas - Los toasts activos se descartan solos a los ~3.5s; el historial persiste hasta 50 entradas o hasta `toast_history_clear`. - Pila vertical de esquina inferior derecha con gap de 8px; ancho fijo 320px. - `NoInputs` en los toasts para que no roben foco ni bloqueen clicks sobre el contenido. - Alpha transicional durante los ultimos 0.6s (fade-out suave). - Si `text` es null o vacio, `toast_push` lo sustituye por "(no message)" para que el inbox nunca quede con entradas en blanco. - La campana usa el codepoint U+1F514 (🔔). Asegurate de que la fuente ImGui tenga cargado el rango de simbolos miscellaneous symbols.