feat(cpp/core): primitivas UI estilo Mantine
Anade 9 primitivas reutilizables al registry C++ que replican el comportamiento de los componentes correspondientes de @fn_library / Mantine v9, todas estilizadas con tokens_cpp_core (colores Mantine dark + indigo): - button_cpp_core (component, pure) variantes primary/secondary/subtle/danger + sm/md/lg - icon_button_cpp_core (component, pure) cuadrado 28x28 con glyph centrado + tooltip - toolbar_cpp_core (component, pure) grupo horizontal de acciones con separadores - modal_dialog_cpp_core (component, pure) popup modal centrada + close con Escape - text_input_cpp_core (component, impure) InputText con label muted + placeholder - select_cpp_core (component, impure) dropdown con label + opcion '(none)' opcional - toast_cpp_core (component, impure) notificaciones efimeras + inbox con badge - tree_view_cpp_core (component, impure) jerarquia low-level con tree_node_clicked helper - process_runner_cpp_core (component, impure) tarea en std::thread + spinner inline Cada primitiva tiene su .md con frontmatter completo (params/output) y se indexa via fn index. Son la base del primitives_gallery y de cualquier app fn_ui futura.
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
---
|
||||
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.
|
||||
Reference in New Issue
Block a user