docs(issues): marcar 0025 y 0026 como completados + WIP master

Wave 1 de parallel-fix-issues integrada a master:
- 0025: text_editor_cpp_core + file_watcher_cpp_core
- 0026: gl_texture_load_cpp_gfx (vendor: stb_image v2.30)

Ademas se commitea WIP previo de master que estaba sin commitear (cambios
en shaders_lab, dag_*, framework, tokens, kpi_card, gl_loader.md, etc.)
para dejar HEAD buildable.

Notas:
- Algunos deps del gallery (button.cpp, toolbar.cpp, modal_dialog.cpp...)
  siguen UNTRACKED — gating con FN_BUILD_GALLERY=ON (default OFF) para
  que master build (sin flag) no los necesite.
- Build OK con y sin flag. fn index registra 904 functions.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-25 21:11:26 +02:00
parent d3d5af51f2
commit b093c898a8
37 changed files with 1819 additions and 342 deletions
+44 -27
View File
@@ -1,37 +1,49 @@
#pragma once
#include "imgui.h"
// Design tokens — colores, spacing, radius, font-size.
// Inspirados en el DESIGN_SYSTEM de @fn_library (Mantine v9 dark + indigo primary).
// Reemplaza hardcode disperso de ImVec4(...) por constantes semánticas.
// Design tokens — identidad visual unica para todas las apps C++ del registry.
// Alineados 1:1 con @fn_library (Mantine v9 dark + indigo primary).
// Ver cpp/DESIGN_SYSTEM.md para la especificacion completa.
//
// Equivalencias frontend -> C++:
// createTheme({ primaryColor: 'indigo', primaryShade: {dark:4},
// defaultRadius: 'md', defaultColorScheme: 'dark' })
// se corresponde con los valores de este header.
namespace fn_tokens {
namespace colors {
// Primary (indigo-inspired, Mantine indigo.6)
constexpr ImVec4 primary {0.25f, 0.37f, 0.85f, 1.0f};
constexpr ImVec4 primary_hover {0.30f, 0.42f, 0.90f, 1.0f};
// Primary — Mantine indigo (primaryShade dark = 4)
// indigo.4 = #748FFC indigo.5 = #5C7CFA indigo.6 = #4C6EF5 indigo.7 = #4263EB
constexpr ImVec4 primary {0.298f, 0.431f, 0.961f, 1.0f}; // indigo.6 (base)
constexpr ImVec4 primary_hover {0.361f, 0.486f, 0.980f, 1.0f}; // indigo.5
constexpr ImVec4 primary_light {0.455f, 0.561f, 0.988f, 1.0f}; // indigo.4 (dark mode accent)
constexpr ImVec4 primary_active {0.259f, 0.388f, 0.922f, 1.0f}; // indigo.7
// Semantic
constexpr ImVec4 success {0.13f, 0.70f, 0.42f, 1.0f};
constexpr ImVec4 warning {0.95f, 0.60f, 0.20f, 1.0f};
constexpr ImVec4 error {0.87f, 0.26f, 0.30f, 1.0f};
constexpr ImVec4 info {0.22f, 0.55f, 0.95f, 1.0f};
// Semantic — colores Mantine oficiales
constexpr ImVec4 success {0.251f, 0.753f, 0.341f, 1.0f}; // green.6 #40C057
constexpr ImVec4 warning {0.980f, 0.690f, 0.020f, 1.0f}; // yellow.6 #FAB005
constexpr ImVec4 error {0.980f, 0.322f, 0.322f, 1.0f}; // red.6 #FA5252
constexpr ImVec4 info {0.133f, 0.545f, 0.902f, 1.0f}; // blue.6 #228BE6
// Background (dark by default — matches DESIGN_SYSTEM.md §2 & §8)
constexpr ImVec4 bg {0.08f, 0.08f, 0.10f, 1.0f}; // window bg
constexpr ImVec4 surface {0.12f, 0.12f, 0.15f, 1.0f}; // panels/cards
constexpr ImVec4 surface_hover {0.16f, 0.16f, 0.20f, 1.0f};
// Text
constexpr ImVec4 text {0.95f, 0.95f, 0.95f, 1.0f};
constexpr ImVec4 text_muted {0.60f, 0.60f, 0.65f, 1.0f};
constexpr ImVec4 text_dim {0.40f, 0.40f, 0.45f, 1.0f};
// Surfaces — escala dark Mantine (oscuro a claro: dark.9 -> dark.0)
constexpr ImVec4 bg {0.102f, 0.106f, 0.118f, 1.0f}; // dark.7 #1A1B1E body bg
constexpr ImVec4 surface {0.145f, 0.149f, 0.169f, 1.0f}; // dark.6 #25262B Paper/Card
constexpr ImVec4 surface_hover {0.173f, 0.180f, 0.200f, 1.0f}; // dark.5 #2C2E33
constexpr ImVec4 surface_active{0.216f, 0.227f, 0.251f, 1.0f}; // dark.4 #373A40
// Border
constexpr ImVec4 border {0.20f, 0.20f, 0.25f, 1.0f};
constexpr ImVec4 border {0.216f, 0.227f, 0.251f, 1.0f}; // dark.4 #373A40
constexpr ImVec4 border_strong {0.361f, 0.373f, 0.400f, 1.0f}; // dark.3 #5C5F66
// Text (escala dark inversa: dark.0 mas claro)
constexpr ImVec4 text {0.757f, 0.761f, 0.773f, 1.0f}; // dark.0 #C1C2C5 texto primario
constexpr ImVec4 text_muted {0.565f, 0.573f, 0.588f, 1.0f}; // dark.2 #909296 subtitulos
constexpr ImVec4 text_dim {0.361f, 0.373f, 0.400f, 1.0f}; // dark.3 #5C5F66 disabled
}
// Spacing — adaptado para ImGui (densidad mayor que CSS).
// Mantine usa 10/12/16/20/32 px, aqui densificamos al estilo TUI clasico.
namespace spacing {
constexpr float xs = 4.0f;
constexpr float sm = 8.0f;
@@ -40,12 +52,14 @@ namespace spacing {
constexpr float xl = 24.0f;
}
// Radius — mapeo directo Mantine (defaultRadius: 'md' = 8px).
namespace radius {
constexpr float none = 0.0f;
constexpr float sm = 3.0f;
constexpr float md = 5.0f;
constexpr float lg = 8.0f;
constexpr float xl = 12.0f;
constexpr float xs = 2.0f;
constexpr float sm = 4.0f;
constexpr float md = 8.0f; // default para Paper/Card/Button/Input
constexpr float lg = 12.0f;
constexpr float xl = 16.0f;
}
namespace font_size {
@@ -57,8 +71,11 @@ namespace font_size {
constexpr float xxl = 32.0f;
}
// Aplica los tokens al ImGuiStyle global. Llamar una vez al arrancar la app,
// después de ImGui::CreateContext() y antes del primer frame.
// Aplica la identidad visual al ImGuiStyle y a los estilos de ImPlot (si
// esta enlazado). Se invoca automaticamente desde fn::run_app() (app_base.h)
// salvo que AppConfig::theme sea ImGuiDark/ImGuiLight/None.
// Idempotente: se puede llamar varias veces sin efectos secundarios.
// No desactiva ninguna feature de ImGui (docking, viewports, etc).
void apply_dark_theme();
} // namespace fn_tokens