fda89ca3ba
Trasladar principios del DESIGN_SYSTEM.md de @fn_library (Mantine/React)
al mundo C++/ImGui sin añadir deps externas:
cpp/functions/core/
tokens — colors/spacing/radius/font_size como constexpr +
apply_dark_theme() al ImGuiStyle global. Dark + indigo
primary (Mantine-inspired).
badge — etiqueta inline 6 variantes (Default/Success/Warning/
Error/Info/Outline). <Badge> de @fn_library en C++.
empty_state — placeholder centrado para tablas/listas vacías.
page_header — header con title + subtitle + separator + hueco
para acciones (patrón begin/end).
Scope limitado (KISS) a fases 1-2 del plan: tokens + 3 primitivos.
No se duplica dashboard_panel con un "card" — el existente ya cumple
el rol. Fases 3-5 (charts ImPlot line/area, app_shell con navbar,
toast/alert) quedan fuera hasta que el dashboard crezca en alcance.
Resultado:
- 869 funciones (+4) en registry.db.
- Dashboard con header homogéneo y empty states en todas las tablas.
- Sin hardcode de ImVec4 disperso en views.cpp.
Diary + CHANGELOG actualizados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
45 lines
1.6 KiB
C++
45 lines
1.6 KiB
C++
#include "badge.h"
|
|
#include "tokens.h"
|
|
#include "imgui.h"
|
|
|
|
static ImVec4 badge_bg(BadgeVariant v) {
|
|
using namespace fn_tokens::colors;
|
|
switch (v) {
|
|
case BadgeVariant::Success: return success;
|
|
case BadgeVariant::Warning: return warning;
|
|
case BadgeVariant::Error: return error;
|
|
case BadgeVariant::Info: return info;
|
|
case BadgeVariant::Outline: return ImVec4(0, 0, 0, 0);
|
|
case BadgeVariant::Default:
|
|
default: return surface_hover;
|
|
}
|
|
}
|
|
|
|
void badge(const char* text, BadgeVariant variant) {
|
|
ImVec4 bg = badge_bg(variant);
|
|
ImVec4 tx = (variant == BadgeVariant::Outline || variant == BadgeVariant::Default)
|
|
? fn_tokens::colors::text
|
|
: ImVec4(1.0f, 1.0f, 1.0f, 1.0f);
|
|
|
|
const float pad_x = fn_tokens::spacing::sm;
|
|
const float pad_y = fn_tokens::spacing::xs * 0.5f;
|
|
ImVec2 text_size = ImGui::CalcTextSize(text);
|
|
ImVec2 cursor = ImGui::GetCursorScreenPos();
|
|
ImVec2 p_min = cursor;
|
|
ImVec2 p_max = ImVec2(cursor.x + text_size.x + pad_x * 2.0f,
|
|
cursor.y + text_size.y + pad_y * 2.0f);
|
|
|
|
ImDrawList* dl = ImGui::GetWindowDrawList();
|
|
if (variant == BadgeVariant::Outline) {
|
|
dl->AddRect(p_min, p_max, ImGui::GetColorU32(fn_tokens::colors::border),
|
|
fn_tokens::radius::md);
|
|
} else {
|
|
dl->AddRectFilled(p_min, p_max, ImGui::GetColorU32(bg),
|
|
fn_tokens::radius::md);
|
|
}
|
|
dl->AddText(ImVec2(cursor.x + pad_x, cursor.y + pad_y),
|
|
ImGui::GetColorU32(tx), text);
|
|
|
|
ImGui::Dummy(ImVec2(p_max.x - p_min.x, p_max.y - p_min.y));
|
|
}
|